/ Hex Artifact Content
Login

Artifact 23bad79f6ad51249aabb90314aa4a75282f9ff3f7f8dcaad7521fa44c2a7eab8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
3e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3e50: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a  _CONCURRENT./*.*
3e60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3e70: 73 74 72 75 63 74 75 72 65 20 2d 20 42 74 72 65  structure - Btre
3e80: 65 50 74 72 6d 61 70 20 2d 20 73 74 6f 72 65 73  ePtrmap - stores
3e90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
3ea0: 6f 69 6e 74 65 72 20 6d 61 70 0a 2a 2a 20 75 73  ointer map.** us
3eb0: 65 64 20 66 6f 72 20 6e 65 77 6c 79 20 61 6c 6c  ed for newly all
3ec0: 6f 63 61 74 65 64 20 70 61 67 65 73 20 69 6e 20  ocated pages in 
3ed0: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
3ee0: 61 63 74 69 6f 6e 73 2e 20 53 75 63 68 20 70 61  actions. Such pa
3ef0: 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79  ges are.** alway
3f00: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61  s allocated in a
3f10: 20 63 6f 6e 74 69 67 75 6f 75 73 20 62 6c 6f 63   contiguous bloc
3f20: 6b 20 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  k (from the end 
3f30: 6f 66 20 74 68 65 20 66 69 6c 65 29 20 73 74 61  of the file) sta
3f40: 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 70 61  rting.** with pa
3f50: 67 65 20 42 74 72 65 65 50 74 72 6d 61 70 2e 69  ge BtreePtrmap.i
3f60: 46 69 72 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65  First..*/.typede
3f70: 66 20 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63  f struct Rollbac
3f80: 6b 45 6e 74 72 79 20 52 6f 6c 6c 62 61 63 6b 45  kEntry RollbackE
3f90: 6e 74 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74  ntry;.typedef st
3fa0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fb0: 20 50 74 72 6d 61 70 45 6e 74 72 79 3b 0a 73 74   PtrmapEntry;.st
3fc0: 72 75 63 74 20 50 74 72 6d 61 70 45 6e 74 72 79  ruct PtrmapEntry
3fd0: 20 7b 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e 74   {.  Pgno parent
3fe0: 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a 7d 3b  ;.  u8 eType;.};
3ff0: 0a 73 74 72 75 63 74 20 52 6f 6c 6c 62 61 63 6b  .struct Rollback
4000: 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e 6f 20 70  Entry {.  Pgno p
4010: 67 6e 6f 3b 0a 20 20 50 67 6e 6f 20 70 61 72 65  gno;.  Pgno pare
4020: 6e 74 3b 0a 20 20 75 38 20 65 54 79 70 65 3b 0a  nt;.  u8 eType;.
4030: 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65 65 50  };.struct BtreeP
4040: 74 72 6d 61 70 20 7b 0a 20 20 50 67 6e 6f 20 69  trmap {.  Pgno i
4050: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4070: 73 74 20 6e 65 77 20 70 61 67 65 20 6e 75 6d 62  st new page numb
4080: 65 72 20 61 50 74 72 5b 30 5d 20 2a 2f 0a 0a 20  er aPtr[0] */.. 
4090: 20 69 6e 74 20 6e 50 74 72 41 6c 6c 6f 63 3b 20   int nPtrAlloc; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
40c0: 7a 65 20 6f 66 20 61 50 74 72 5b 5d 20 61 72 72  ze of aPtr[] arr
40d0: 61 79 20 2a 2f 0a 20 20 50 74 72 6d 61 70 45 6e  ay */.  PtrmapEn
40e0: 74 72 79 20 2a 61 50 74 72 3b 20 20 20 20 20 20  try *aPtr;      
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4100: 20 6f 66 20 70 61 72 65 6e 74 20 70 61 67 65 20   of parent page 
4110: 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 69 6e  numbers */..  in
4120: 74 20 6e 53 76 70 74 3b 20 20 20 20 20 20 20 20  t nSvpt;        
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4140: 20 55 73 65 64 20 73 69 7a 65 20 6f 66 20 61 53   Used size of aS
4150: 76 70 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vpt[] array */. 
4160: 20 69 6e 74 20 6e 53 76 70 74 41 6c 6c 6f 63 3b   int nSvptAlloc;
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
4190: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 2a 2f  ze of aSvpt[] */
41a0: 0a 20 20 69 6e 74 20 2a 61 53 76 70 74 3b 20 20  .  int *aSvpt;  
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 52 6f 6c     /* First aRol
41d0: 6c 62 61 63 6b 5b 5d 20 65 6e 74 72 79 20 66 6f  lback[] entry fo
41e0: 72 20 73 61 76 65 70 6f 69 6e 74 20 69 20 2a 2f  r savepoint i */
41f0: 0a 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63  ..  int nRollbac
4200: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4210: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69 7a 65      /* Used size
4220: 20 6f 66 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20   of aRollback[] 
4230: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 3b 20 20  RollbackAlloc;  
4250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4260: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4270: 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20 61 72 72 61  aRollback[] arra
4280: 79 20 2a 2f 0a 20 20 52 6f 6c 6c 62 61 63 6b 45  y */.  RollbackE
4290: 6e 74 72 79 20 2a 61 52 6f 6c 6c 62 61 63 6b 3b  ntry *aRollback;
42a0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
42b0: 6f 66 20 72 6f 6c 6c 62 61 63 6b 20 65 6e 74 72  of rollback entr
42c0: 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 21 64  ies */.};../* !d
42d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
42e0: 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
42f0: 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 6e 75 6d  *.** If page num
4300: 62 65 72 20 70 67 6e 6f 20 69 73 20 67 72 65 61  ber pgno is grea
4310: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4320: 6c 20 74 6f 20 42 74 72 65 65 50 74 72 6d 61 70  l to BtreePtrmap
4330: 2e 69 46 69 72 73 74 2c 20 0a 2a 2a 20 73 74 6f  .iFirst, .** sto
4340: 72 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20  re an entry for 
4350: 69 74 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  it in the pointe
4360: 72 2d 6d 61 70 20 73 74 72 75 63 74 75 72 65 2e  r-map structure.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 74 72 65 65 50 74 72 6d 61 70 53 74 6f 72 65 28  treePtrmapStore(
4390: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
43a0: 2c 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 0a 20  ,.  Pgno pgno,. 
43b0: 20 75 38 20 65 54 79 70 65 2c 20 0a 20 20 50 67   u8 eType, .  Pg
43c0: 6e 6f 20 70 61 72 65 6e 74 0a 29 7b 0a 20 20 42  no parent.){.  B
43d0: 74 72 65 65 50 74 72 6d 61 70 20 2a 70 4d 61 70  treePtrmap *pMap
43e0: 20 3d 20 70 42 74 2d 3e 70 4d 61 70 3b 0a 20 20   = pBt->pMap;.  
43f0: 69 66 28 20 70 67 6e 6f 3e 3d 70 4d 61 70 2d 3e  if( pgno>=pMap->
4400: 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e  iFirst ){.    in
4410: 74 20 69 45 6e 74 72 79 20 3d 20 70 67 6e 6f 20  t iEntry = pgno 
4420: 2d 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 3b 0a  - pMap->iFirst;.
4430: 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
4440: 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20 61 73   aPtr[] array as
4450: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
4460: 20 77 68 69 6c 65 28 20 69 45 6e 74 72 79 3e 3d   while( iEntry>=
4470: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20  pMap->nPtrAlloc 
4480: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
4490: 77 20 3d 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c  w = pMap->nPtrAl
44a0: 6c 6f 63 20 3f 20 70 4d 61 70 2d 3e 6e 50 74 72  loc ? pMap->nPtr
44b0: 41 6c 6c 6f 63 2a 32 20 3a 20 31 36 3b 0a 20 20  Alloc*2 : 16;.  
44c0: 20 20 20 20 50 74 72 6d 61 70 45 6e 74 72 79 20      PtrmapEntry 
44d0: 2a 61 4e 65 77 20 3d 20 28 50 74 72 6d 61 70 45  *aNew = (PtrmapE
44e0: 6e 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65  ntry*)sqlite3_re
44f0: 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
4500: 20 70 4d 61 70 2d 3e 61 50 74 72 2c 20 6e 4e 65   pMap->aPtr, nNe
4510: 77 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45  w*sizeof(PtrmapE
4520: 6e 74 72 79 29 0a 20 20 20 20 20 20 29 3b 0a 20  ntry).      );. 
4530: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4550: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4570: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
4580: 3d 20 28 6e 4e 65 77 2d 70 4d 61 70 2d 3e 6e 50  = (nNew-pMap->nP
4590: 74 72 41 6c 6c 6f 63 29 2a 73 69 7a 65 6f 66 28  trAlloc)*sizeof(
45a0: 50 74 72 6d 61 70 45 6e 74 72 79 29 3b 0a 20 20  PtrmapEntry);.  
45b0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
45c0: 65 77 5b 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c  ew[pMap->nPtrAll
45d0: 6f 63 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  oc], 0, nByte);.
45e0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 50          pMap->aP
45f0: 74 72 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  tr = aNew;.     
4600: 20 20 20 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c     pMap->nPtrAll
4610: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  oc = nNew;.     
4620: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
4630: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
4640: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f   the rollback lo
4650: 67 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  g if required */
4660: 0a 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e  .    if( pMap->n
4670: 53 76 70 74 3e 30 20 26 26 20 70 4d 61 70 2d 3e  Svpt>0 && pMap->
4680: 61 50 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72  aPtr[iEntry].par
4690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
46a0: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
46b0: 3e 3d 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  >=pMap->nRollbac
46c0: 6b 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  kAlloc ){.      
46d0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61    int nNew = pMa
46e0: 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 20 3f 20 70  p->nRollback ? p
46f0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2a 32  Map->nRollback*2
4700: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 20 20 52   : 16;.        R
4710: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 4e  ollbackEntry *aN
4720: 65 77 20 3d 20 28 52 6f 6c 6c 62 61 63 6b 45 6e  ew = (RollbackEn
4730: 74 72 79 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  try*)sqlite3_rea
4740: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
4750: 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63    pMap->aRollbac
4760: 6b 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 52  k, nNew*sizeof(R
4770: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 29 0a 20 20  ollbackEntry).  
4780: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4790: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
47a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
47b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
47c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
47d0: 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52          pMap->aR
47e0: 6f 6c 6c 62 61 63 6b 20 3d 20 61 4e 65 77 3b 0a  ollback = aNew;.
47f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4800: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 3d  nRollbackAlloc =
4810: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
4830: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4840: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d  pMap->nRollback]
4850: 2e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  .pgno = pgno;.  
4860: 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62      pMap->aRollb
4870: 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62  ack[pMap->nRollb
4880: 61 63 6b 5d 2e 70 61 72 65 6e 74 20 3d 20 70 4d  ack].parent = pM
4890: 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79 5d  ap->aPtr[iEntry]
48a0: 2e 70 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 70  .parent;.      p
48b0: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70  Map->aRollback[p
48c0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e  Map->nRollback].
48d0: 65 54 79 70 65 20 3d 20 70 4d 61 70 2d 3e 61 50  eType = pMap->aP
48e0: 74 72 5b 69 45 6e 74 72 79 5d 2e 65 54 79 70 65  tr[iEntry].eType
48f0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4900: 6f 6c 6c 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 7d  ollback++;.    }
4910: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
4920: 74 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79  the aPtr[] array
4930: 20 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50   */.    pMap->aP
4940: 74 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e  tr[iEntry].paren
4950: 74 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20  t = parent;.    
4960: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4970: 79 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65  y].eType = eType
4980: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
49a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
49b0: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
49c0: 29 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76  ).**.** Open sav
49d0: 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
49e0: 74 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  t, if it is not 
49f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f  already open..*/
4a00: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4a10: 65 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53  ePtrmapBegin(BtS
4a20: 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
4a30: 6e 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  nSvpt){.  BtreeP
4a40: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4a50: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4a60: 4d 61 70 20 26 26 20 6e 53 76 70 74 3e 70 4d 61  Map && nSvpt>pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
4a90: 53 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70  Svpt>=pMap->nSvp
4aa0: 74 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  tAlloc ){.      
4ab0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d  int nNew = pMap-
4ac0: 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d  >nSvptAlloc ? pM
4ad0: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32  ap->nSvptAlloc*2
4ae0: 20 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74   : 16;.      int
4af0: 20 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *aNew = sqlite3
4b00: 5f 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61  _realloc(pMap->a
4b10: 53 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Svpt, sizeof(int
4b20: 29 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20  ) * nNew);.     
4b30: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
4b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
4b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b70: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20    pMap->aSvpt = 
4b80: 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d  aNew;.        pM
4b90: 61 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d  ap->nSvptAlloc =
4ba0: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20   nNew;.      }. 
4bb0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
4bc0: 70 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e  pMap->nSvpt; i<n
4bd0: 53 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Svpt; i++){.    
4be0: 20 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d    pMap->aSvpt[i]
4bf0: 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61   = pMap->nRollba
4c00: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  ck;.    }.    pM
4c10: 61 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70  ap->nSvpt = nSvp
4c20: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
4c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4c40: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4c50: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4c60: 54 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  T).**.** Rollbac
4c70: 6b 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f  k (if op==SAVEPO
4c80: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72  INT_ROLLBACK) or
4c90: 20 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d   release (if op=
4ca0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4cb0: 53 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  SE).** savepoint
4cc0: 20 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   iSvpt..*/.stati
4cd0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d  c void btreePtrm
4ce0: 61 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a  apEnd(BtShared *
4cf0: 70 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74  pBt, int op, int
4d00: 20 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65   iSvpt){.  Btree
4d10: 50 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70  Ptrmap *pMap = p
4d20: 42 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20  Bt->pMap;.  if( 
4d30: 70 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  pMap ){.    asse
4d40: 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
4d50: 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70  T_ROLLBACK || op
4d60: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
4d70: 41 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ASE );.    asser
4d80: 74 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28  t( iSvpt>=0 || (
4d90: 69 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  iSvpt==-1 && op=
4da0: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
4db0: 41 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ACK) );.    if( 
4dc0: 69 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20  iSvpt<0 ){.     
4dd0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30   pMap->nSvpt = 0
4de0: 3b 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52  ;.      pMap->nR
4df0: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
4e00: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e     memset(pMap->
4e10: 61 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aPtr, 0, sizeof(
4e20: 50 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50  Pgno) * pMap->nP
4e30: 74 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65  trAlloc);.    }e
4e40: 6c 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d  lse if( iSvpt<pM
4e50: 61 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20  ap->nSvpt ){.   
4e60: 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
4e70: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
4e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
4e90: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
4ea0: 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d  pMap->nRollback-
4eb0: 31 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76  1; ii>=pMap->aSv
4ec0: 70 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29  pt[iSvpt]; ii--)
4ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c  {.          Roll
4ee0: 62 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26  backEntry *p = &
4ef0: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b  pMap->aRollback[
4f00: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ii];.          P
4f10: 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74  trmapEntry *pEnt
4f20: 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72  ry = &pMap->aPtr
4f30: 5b 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d  [p->pgno - pMap-
4f40: 3e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  >iFirst];.      
4f50: 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65      pEntry->pare
4f60: 6e 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a  nt = p->parent;.
4f70: 20 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79            pEntry
4f80: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
4f90: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
4fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70      }.      pMap
4fb0: 2d 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20  ->nSvpt = iSvpt 
4fc0: 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  + (op==SAVEPOINT
4fd0: 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
4fe0: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4ff0: 6b 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b  k = pMap->aSvpt[
5000: 69 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20  iSvpt];.    }.  
5010: 7d 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64  }.}../* !defined
5020: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e  (SQLITE_OMIT_CON
5030: 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54  CURRENT).**.** T
5040: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5050: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
5060: 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
5070: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
5080: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
5090: 61 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65  ase. It allocate
50a0: 73 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  s the BtreePtrma
50b0: 70 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64  p structure used
50c0: 20 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65   to track pointe
50d0: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74  rs.** to allocat
50e0: 65 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72  ed pages and zer
50f0: 6f 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54  oes the nFree/iT
5100: 72 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74  runk fields in t
5110: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
5120: 68 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31  header on page 1
5130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5140: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5150: 61 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ate(BtShared *pB
5160: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
5170: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5180: 70 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  pBt->pMap==0 ){.
5190: 20 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20      BtreePtrmap 
51a0: 2a 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f  *pMap = sqlite3_
51b0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  malloc(sizeof(Bt
51c0: 72 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20  reePtrmap));.   
51d0: 20 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a   if( pMap==0 ){.
51e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
51f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
5200: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
5210: 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
5220: 44 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a  Data[32], 0, siz
5230: 65 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20  eof(u32)*2);.   
5240: 20 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20     memset(pMap, 
5250: 30 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  0, sizeof(BtreeP
5260: 74 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70  trmap));.      p
5270: 4d 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42  Map->iFirst = pB
5280: 74 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20  t->nPage + 1;.  
5290: 20 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20      pBt->pMap = 
52a0: 70 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pMap;.    }.  }.
52b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52c0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
52e0: 4e 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61  NT).**.** Free a
52f0: 6e 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73  ny BtreePtrmap s
5300: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
5310: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
5320: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65   call to.** btre
5330: 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28  ePtrmapAllocate(
5340: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5350: 64 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c  d btreePtrmapDel
5360: 65 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ete(BtShared *pB
5370: 74 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61  t){.  BtreePtrma
5380: 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70  p *pMap = pBt->p
5390: 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20  Map;.  if( pMap 
53a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
53b0: 72 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62  ree(pMap->aRollb
53c0: 61 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ack);.    sqlite
53d0: 33 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74  3_free(pMap->aPt
53e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
53f0: 66 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74  free(pMap->aSvpt
5400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5410: 72 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70  ree(pMap);.    p
5420: 42 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20  Bt->pMap = 0;.  
5430: 7d 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51  }.}.#else  /* SQ
5440: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
5450: 52 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65  RENT */.# define
5460: 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
5470: 63 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f  cate(x) SQLITE_O
5480: 4b 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65  K.# define btree
5490: 50 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20  PtrmapDelete(x) 
54a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
54b0: 74 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20  trmapBegin(x,y) 
54c0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
54d0: 69 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45  ine btreePtrmapE
54e0: 6e 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  nd(x,y,z) .#endi
54f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5500: 5f 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a  _CONCURRENT */..
5510: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
5520: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
5530: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
5540: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
5550: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
5560: 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d  leasePageOne(Mem
5570: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
5580: 20 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65     /* Forward re
5590: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
55a0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
55b0: 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67  geNotNull(MemPag
55c0: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
55d0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
55e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68   */../*.***** Th
55f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5600: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
5610: 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a  ert() only ****.
5620: 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  **.** Verify tha
5630: 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c  t the cursor hol
5640: 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ds the mutex on 
5650: 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  its BtShared.*/.
5660: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5670: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
5680: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5690: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
56a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
56b0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
56c0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20  ->mutex);.}../* 
56d0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
56e0: 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42  cursor and the B
56f0: 74 53 68 61 72 65 64 20 61 67 72 65 65 20 61 62  tShared agree ab
5700: 6f 75 74 20 77 68 61 74 20 69 73 20 74 68 65 20  out what is the 
5710: 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  current.** datab
5720: 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54  ase connetion. T
5730: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
5740: 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65   in shared-cache
5750: 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61   mode. If the da
5760: 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65  tabase .** conne
5770: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67  ction pointers g
5780: 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20  et out-of-sync, 
5790: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
57a0: 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65  or routines like
57b0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
57c0: 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65  e() to reference
57d0: 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63   an stale connec
57e0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61  tion pointer tha
57f0: 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a  t references a.*
5800: 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  * a connection t
5810: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
5820: 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f  closed.  This ro
5830: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e  utine is used in
5840: 73 69 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a  side assert().**
5850: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79   statements only
5860: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72   and for the pur
5870: 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63  pose of double-c
5880: 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65  hecking that the
5890: 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64   btree code.** d
58a0: 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64 61 74  oes keep the dat
58b0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
58c0: 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d   pointers up-to-
58d0: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
58e0: 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  int cursorOwnsBt
58f0: 53 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20  Shared(BtCursor 
5900: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  *p){.  assert( c
5910: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5920: 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  p) );.  return (
5930: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  p->pBtree->db==p
5940: 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65  ->pBt->db);.}.#e
5950: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  ndif../*.** Inva
5960: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
5970: 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65  low cache of the
5980: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5990: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
59a0: 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20  ment..** on the 
59b0: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
59c0: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23  ucture pBt..*/.#
59d0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
59e0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
59f0: 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46  Cur) (pCur->curF
5a00: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
5a10: 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20  lidOvfl)../*.** 
5a20: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
5a30: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
5a40: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
5a50: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
5a60: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
5a70: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
5a80: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
5a90: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
5aa0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
5ab0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
5ac0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5ae0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5af0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
5b00: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
5b10: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5b20: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
5b30: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
5b40: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
5b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
5b60: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  LOB./*.** This f
5b70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5b80: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
5b90: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
5ba0: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
5bb0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
5bc0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
5bd0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5be0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
5bf0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
5c00: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
5c10: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
5c20: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
5c30: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
5c40: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
5c50: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
5c60: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
5c70: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
5c80: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
5c90: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
5ca0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5cb0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
5cc0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
5cd0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
5ce0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
5cf0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
5d00: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
5d10: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
5d20: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
5d30: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
5d40: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
5d50: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
5d60: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
5d70: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
5d80: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
5d90: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
5da0: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
5db0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
5dc0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
5dd0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
5de0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
5df0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
5e00: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
5e10: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
5e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
5e30: 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  le that might be
5e40: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
5e50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
5e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
5e70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
5e80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
5e90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
5ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5eb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
5ec0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
5ed0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
5ee0: 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d  p;.  if( pBtree-
5ef0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d  >hasIncrblobCur=
5f00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
5f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
5f20: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
5f30: 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65  tree) );.  pBtre
5f40: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
5f50: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  r = 0;.  for(p=p
5f60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
5f70: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5f80: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
5f90: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
5fa0: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b  _Incrblob)!=0 ){
5fb0: 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68  .      pBtree->h
5fc0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
5fd0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  1;.      if( p->
5fe0: 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f  pgnoRoot==pgnoRo
5ff0: 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  ot && (isClearTa
6000: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
6010: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
6020: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
6030: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6040: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6050: 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f    }.}..#else.  /
6060: 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20  * Stub function 
6070: 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73  when INCRBLOB is
6080: 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64   omitted */.  #d
6090: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
60a0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
60b0: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20  w,x,y,z).#endif 
60c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
60d0: 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
60e0: 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f  * Set bit pgno o
60f0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  f the BtShared.p
6100: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
6110: 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  c. This is calle
6120: 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67  d .** when a pag
6130: 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c  e that previousl
6140: 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61  y contained data
6150: 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
6160: 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61  list leaf .** pa
6170: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74  ge..**.** The Bt
6180: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
6190: 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73  nt bitvec exists
61a0: 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
61b0: 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75  an obscure.** bu
61c0: 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20  g caused by the 
61d0: 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74  interaction of t
61e0: 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74  wo useful IO opt
61f0: 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f  imizations surro
6200: 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c  unding.** free-l
6210: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a  ist leaf pages:.
6220: 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20  **.**   1) When 
6230: 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65  all data is dele
6240: 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20  ted from a page 
6250: 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63  and the page bec
6260: 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66  omes.**      a f
6270: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
6280: 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20  ge, the page is 
6290: 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
62b0: 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73      (as free-lis
62c0: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e  t leaf pages con
62d0: 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66  tain no meaningf
62e0: 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69  ul data). Someti
62f0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68  mes.**      such
6300: 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65   a page is not e
6310: 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28  ven journalled (
6320: 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
6330: 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20  e modified,.**  
6340: 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a      why bother j
6350: 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e  ournalling it?).
6360: 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
6370: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
6380: 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64  f page is reused
6390: 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73  , its content is
63a0: 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20   not read.**    
63b0: 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62    from the datab
63c0: 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74  ase or written t
63d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
63e0: 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69  le (why should i
63f0: 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66  t.**      be, if
6400: 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c   it is not at al
6410: 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a  l meaningful?)..
6420: 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c  **.** By themsel
6430: 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d  ves, these optim
6440: 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69  izations work fi
6450: 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61  ne and provide a
6460: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72   handy.** perfor
6470: 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62  mance boost to b
6480: 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e  ulk delete or in
6490: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e  sert operations.
64a0: 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20   However, if.** 
64b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
64c0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
64d0: 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64   and then reused
64e0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
64f0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  .** transaction,
6500: 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73   a problem comes
6510: 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65   up. If the page
6520: 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c   is not journall
6530: 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73  ed when.** it is
6540: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
6550: 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69  ee-list and it i
6560: 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e  s also not journ
6570: 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a  alled when it.**
6580: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6590: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
65a0: 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65   and reused, the
65b0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  n the original d
65c0: 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f  ata.** may be lo
65d0: 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74  st. In the event
65e0: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20   of a rollback, 
65f0: 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f  it may not be po
6600: 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73  ssible.** to res
6610: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
6620: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
6630: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l configuration.
6640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74  .**.** The solut
6650: 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61  ion is the BtSha
6660: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
6670: 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72  bitvec. Whenever
6680: 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d   a page is .** m
6690: 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61  oved to become a
66a0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
66b0: 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73  page, the corres
66c0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a  ponding bit is.*
66d0: 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74  * set in the bit
66e0: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
66f0: 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74  leaf page is ext
6700: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
6710: 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70  free-list,.** op
6720: 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f  timization 2 abo
6730: 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66  ve is omitted if
6740: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6750: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
6760: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
6770: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
6780: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
6790: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
67a0: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
67b0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
67c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
67d0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
67e0: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
67f0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6800: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
6810: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6820: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
6830: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73  ontent ){.    as
6840: 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d  sert( pgno<=pBt-
6850: 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42  >nPage );.    pB
6860: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
6870: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
6880: 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29  eate(pBt->nPage)
6890: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
68a0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
68b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
68c0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
68d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
68e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
68f0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
6900: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
6910: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
6920: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
6930: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
6940: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
6950: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6960: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
6970: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
6980: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
6990: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
69a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
69b0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
69c0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
69d0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
69e0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
69f0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
6a00: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
6a10: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
6a20: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
6a30: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
6a40: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
6a50: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
6a60: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
6a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6a80: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
6a90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6aa0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
6ab0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
6ac0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
6ad0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
6ae0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
6af0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
6b00: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
6b10: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
6b20: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
6b30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
6b40: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
6b50: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
6b60: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
6b70: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
6b80: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
6b90: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
6ba0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
6bb0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
6bc0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
6bd0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
6be0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
6bf0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
6c00: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
6c10: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6c20: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
6c30: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
6c40: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
6c50: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
6c60: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
6c70: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
6c80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
6c90: 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
6ca0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6cb0: 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
6cd0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
6ce0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
6cf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
6d00: 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
6d10: 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70  r->pPage);.    p
6d20: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
6d30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6d40: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
6d50: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
6d60: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
6d70: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
6d80: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
6d90: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
6da0: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
6db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6dc0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
6dd0: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
6de0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
6df0: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
6e00: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
6e10: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
6e20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6e30: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
6e40: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
6e50: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
6e60: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
6e70: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
6e80: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
6e90: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
6ea0: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
6eb0: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
6ec0: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
6ed0: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
6ee0: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
6ef0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
6f00: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
6f10: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
6f20: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
6f30: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
6f40: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
6f50: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
6f60: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
6f70: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
6f80: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
6f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6fa0: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
6fb0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6fc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
6fd0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
6fe0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
6ff0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
7000: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
7010: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
7020: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
7030: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
7040: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
7050: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
7060: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
7070: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
7080: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
7090: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
70a0: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
70b0: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
70c0: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
70d0: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
70e0: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
70f0: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
7100: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
7110: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
7120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
7130: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
7140: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
7150: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
7160: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
7170: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
7180: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
7190: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
71a0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
71b0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
71c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
71d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
71e0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
71f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7210: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
7220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7240: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
7260: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
7270: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
7280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7290: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
72a0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
72b0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
72c0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
72d0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
72e0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
72f0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
7300: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
7310: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
7320: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
7330: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
7340: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
7350: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
7360: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
7370: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
7380: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
7390: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
73a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
73b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
73c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
73d0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
73e0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
73f0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
7400: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
7410: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
7420: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
7430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
7440: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
7450: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
7460: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7470: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
7480: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7490: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
74a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
74b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
74c0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
74d0: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
74e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
74f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
7500: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
7510: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
7520: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
7530: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
7540: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
7550: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
7560: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
7570: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
7580: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
7590: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
75a0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
75b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
75c0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
75d0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
75e0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
75f0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
7600: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
7610: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
7620: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
7630: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
7640: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
7650: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
7660: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
7670: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
7680: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
7690: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
76a0: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
76b0: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
76c0: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
76d0: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
76e0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
76f0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
7700: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
7710: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
7720: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
7730: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
7740: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
7750: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
7760: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
7770: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
7780: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
7790: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
77a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
77b0: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
77c0: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
77d0: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
77e0: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
77f0: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
7800: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
7810: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
7820: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
7830: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
7840: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
7850: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7860: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
7870: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
7880: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
7890: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
78a0: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
78b0: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
78c0: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
78d0: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
78e0: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
78f0: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
7900: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
7910: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
7920: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
7930: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
7940: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
7950: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
7960: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
7970: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
7980: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
7990: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
79a0: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
79b0: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
79c0: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
79d0: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
79e0: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
79f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
7a00: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
7a10: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
7a20: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
7a30: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
7a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7a50: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
7a60: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7a70: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
7a80: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
7a90: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
7aa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ab0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7ac0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
7ad0: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
7ae0: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
7af0: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
7b00: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
7b10: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7b20: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7b30: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7b40: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7b50: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
7b60: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
7b70: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
7b80: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
7b90: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
7ba0: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
7bb0: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
7bc0: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
7bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7be0: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
7bf0: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
7c00: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
7c10: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
7c20: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
7c30: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
7c40: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
7c50: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
7c60: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
7c70: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
7c80: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
7c90: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
7ca0: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
7cb0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
7cc0: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
7cd0: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
7ce0: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
7cf0: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
7d00: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
7d10: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
7d20: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
7d30: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
7d40: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
7d50: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
7d60: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
7d70: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
7d80: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
7d90: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
7da0: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
7db0: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
7dc0: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
7dd0: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
7de0: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
7df0: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
7e00: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
7e10: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
7e20: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
7e30: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
7e40: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
7e50: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
7e60: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
7e70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
7e80: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
7e90: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
7ea0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
7eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
7ec0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
7ed0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
7ee0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7ef0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7f00: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
7f10: 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20  Page>=0 );.     
7f20: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
7f30: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
7f40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f50: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7f60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b  ;.  }while( p );
7f70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7f80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
7f90: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
7fa0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
7fb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fc0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
7fd0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7fe0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
7ff0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
8000: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
8010: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
8020: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
8030: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
8040: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
8050: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
8060: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
8070: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
8080: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
8090: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
80a0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
80b0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
80c0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
80d0: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
80e0: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
80f0: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
8100: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
8110: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
8120: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
8130: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
8140: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
8150: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
8160: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
8170: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
8180: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
8190: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
81a0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
81b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
81c0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
81d0: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
81e0: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
81f0: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
8200: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
8210: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
8220: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
8230: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
8240: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
8250: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
8260: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
8270: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
8280: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
8290: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
82a0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
82b0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
82c0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
82d0: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20   index key */.. 
82e0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
82f0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
8300: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
8310: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
8320: 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
8330: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43  npackedRecord(pC
8340: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ur->pKeyInfo);. 
8350: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
8360: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
8370: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
8380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
8390: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
83a0: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
83b0: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
83c0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
83d0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
83e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
83f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8400: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
8410: 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  veto_done;.    }
8420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8430: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
8440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8450: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
8460: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
8470: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
8480: 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a  );.moveto_done:.
8490: 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
84a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
84b0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
84c0: 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b  o->db, pIdxKey);
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
84f0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
8500: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
8510: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
8520: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
8530: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
8540: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
8550: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
8560: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
8570: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
8580: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
8590: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
85a0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
85b0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
85c0: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
85d0: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
85e0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
85f0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
8600: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
8610: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
8620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
8630: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
8640: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
8650: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
8660: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
8670: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
8680: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
8690: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
86a0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
86b0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
86c0: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
86d0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
86e0: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
86f0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
8700: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
8710: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8720: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
8730: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
8740: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
8750: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
8760: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
8770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8790: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
87a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
87b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
87c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
87d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
87e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
87f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
8800: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
8810: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
8820: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
8830: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
8840: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
8850: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
8860: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
8870: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
8880: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8890: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
88a0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
88b0: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
88c0: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
88d0: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
88e0: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
88f0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
8900: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
8910: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
8920: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
8930: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
8940: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
8950: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
8960: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
8970: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
8980: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
8990: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
89a0: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
89b0: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
89c0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
89d0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
89e0: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
89f0: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
8a00: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
8a10: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
8a20: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
8a30: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
8a40: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
8a50: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
8a60: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
8a70: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
8a80: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
8a90: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
8aa0: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
8ab0: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
8ac0: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
8ad0: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
8ae0: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
8af0: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
8b00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
8b10: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
8b20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
8b30: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
8b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
8b50: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
8b60: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 43  YTE_ALIGNMENT(pC
8b70: 75 72 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  ur).       || pC
8b80: 75 72 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ur==sqlite3Btree
8b90: 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28  FakeValidCursor(
8ba0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ) );.  assert( o
8bb0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
8bc0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
8bd0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
8be0: 28 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3d 3d  (pCur->eState)==
8bf0: 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 43 55  1 );.  return CU
8c00: 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d 20 2a 28  RSOR_VALID != *(
8c10: 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a  u8*)pCur;.}../*.
8c20: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
8c30: 74 65 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74  ter to a fake Bt
8c40: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68  Cursor object th
8c50: 61 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61  at will always a
8c60: 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74  nswer.** false t
8c70: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  o the sqlite3Btr
8c80: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
8c90: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
8ca0: 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63  .  The fake.** c
8cb0: 75 72 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d  ursor returned m
8cc0: 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
8cd0: 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42  with any other B
8ce0: 74 72 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a  tree interface..
8cf0: 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c  */.BtCursor *sql
8d00: 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c  ite3BtreeFakeVal
8d10: 69 64 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a  idCursor(void){.
8d20: 20 20 73 74 61 74 69 63 20 75 38 20 66 61 6b 65    static u8 fake
8d30: 43 75 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f  Cursor = CURSOR_
8d40: 56 41 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28  VALID;.  assert(
8d50: 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
8d60: 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29  or, eState)==0 )
8d70: 3b 0a 20 20 72 65 74 75 72 6e 20 28 42 74 43 75  ;.  return (BtCu
8d80: 72 73 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f  rsor*)&fakeCurso
8d90: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
8da0: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
8db0: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
8dc0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
8dd0: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
8de0: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
8df0: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
8e00: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
8e10: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
8e20: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
8e30: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
8e40: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
8e50: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
8e60: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
8e70: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
8e80: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
8e90: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
8ea0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
8eb0: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
8ec0: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
8ed0: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
8ee0: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
8ef0: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
8f00: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
8f10: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
8f20: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
8f30: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
8f40: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
8f50: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
8f60: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
8f70: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
8f80: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
8f90: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
8fa0: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
8fb0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
8fc0: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
8fd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
8fe0: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
8ff0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
9000: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
9010: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
9020: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
9030: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
9040: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
9050: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
9060: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
9070: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
9080: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
9090: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
90a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
90b0: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
90c0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
90d0: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
90e0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
90f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9100: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
9110: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
9120: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
9130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
9150: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9160: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
9170: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74  .** Provide hint
9180: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
9190: 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72    The particular
91a0: 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64   hint given (and
91b0: 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64   the type.** and
91c0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76   number of the v
91d0: 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72  arargs parameter
91e0: 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  s) is determined
91f0: 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70   by the eHintTyp
9200: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20  e.** parameter. 
9210: 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74   See the definit
9220: 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45  ions of the BTRE
9230: 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20  E_HINT_* macros 
9240: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
9250: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
9260: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
9270: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
9280: 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b  eHintType, ...){
9290: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  /* Used only 
92a0: 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73  by system that s
92b0: 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20  ubstitute their 
92c0: 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69  own storage engi
92d0: 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ne */.}.#endif..
92e0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c  /*.** Provide fl
92f0: 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  ag hints to the 
9300: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
9310: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
9320: 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75  orHintFlags(BtCu
9330: 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69  rsor *pCur, unsi
9340: 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72  gned x){.  asser
9350: 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b  t( x==BTREE_SEEK
9360: 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f  _EQ || x==BTREE_
9370: 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30  BULKLOAD || x==0
9380: 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74   );.  pCur->hint
9390: 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  s = x;.}...#ifnd
93a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
93b0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
93c0: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
93d0: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
93e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
93f0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
9400: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
9410: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
9420: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
9430: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
9440: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
9450: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
9460: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
9470: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
9480: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
9490: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
94a0: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
94b0: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
94c0: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
94d0: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
94e0: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
94f0: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
9500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
9510: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
9520: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
9530: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
9540: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
9550: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
9560: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
9570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9580: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
9590: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
95a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
95b0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
95c0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
95d0: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
95e0: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
95f0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
9600: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
9610: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
9620: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
9630: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
9640: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
9650: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
9660: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
9670: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
9680: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
9690: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
96a0: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
96b0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
96c0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
96d0: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
96e0: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
96f0: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
9700: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
9710: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
9720: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
9730: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
9740: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
9750: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
9760: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
9770: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
9780: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
9790: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
97a0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
97b0: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
97c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
97d0: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
97e0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
97f0: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
9800: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
9810: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
9820: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
9830: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
9840: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
9850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
9860: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
9870: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
9880: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
9890: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
98a0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
98b0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
98c0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
98d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
98e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
98f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
9900: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
9910: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
9920: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
9930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9940: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9950: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
9960: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
9970: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6e 65 76  ge number is nev
9980: 65 72 20 61 64 64 65 64 20 74 6f 20 61 20 70 6f  er added to a po
9990: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 2a  inter-map page *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
99b0: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
99c0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
99d0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 23 69  AGE(pBt)) );..#i
99e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
99f0: 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69  T_CONCURRENT.  i
9a00: 66 28 20 70 42 74 2d 3e 70 4d 61 70 20 29 7b 0a  f( pBt->pMap ){.
9a10: 20 20 20 20 2a 70 52 43 20 3d 20 62 74 72 65 65      *pRC = btree
9a20: 50 74 72 6d 61 70 53 74 6f 72 65 28 70 42 74 2c  PtrmapStore(pBt,
9a30: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
9a40: 65 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ent);.    return
9a50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9a60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
9a70: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
9a80: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
9a90: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
9aa0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
9ab0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
9ac0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
9ad0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
9ae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
9af0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
9b00: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
9b10: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
9b20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9b30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
9b40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9b50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
9b60: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
9b70: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
9b80: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
9b90: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
9ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9bb0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
9bc0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
9bd0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
9be0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
9bf0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
9c00: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
9c10: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
9c20: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
9c30: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
9c40: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
9c50: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
9c60: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
9c70: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
9c80: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
9c90: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
9ca0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
9cb0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
9cc0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
9cd0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
9ce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9cf0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
9d00: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
9d10: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
9d20: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
9d30: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
9d40: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
9d50: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9d60: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
9d70: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
9d80: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
9d90: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
9da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9db0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
9dc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
9dd0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
9de0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
9df0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
9e00: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
9e10: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
9e20: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
9e30: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
9e40: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
9e50: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
9e60: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
9e70: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
9e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
9e90: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
9ea0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
9eb0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
9ec0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
9ed0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
9ee0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
9ef0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
9f00: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
9f10: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
9f20: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
9f30: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
9f40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
9f50: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
9f60: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
9f70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
9f80: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
9f90: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
9fa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9fb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9fc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
9fd0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
9fe0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
9ff0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
a000: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
a010: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
a020: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
a030: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
a040: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
a050: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
a060: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
a070: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
a080: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
a090: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
a0a0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
a0b0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
a0c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
a0d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
a0e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a0f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a100: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
a110: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
a120: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
a130: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
a140: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
a150: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
a160: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
a170: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
a180: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
a190: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
a1a0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
a1b0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
a1c0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
a1d0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
a1e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
a1f0: 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72  NO(iPtrmap);.  r
a200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a210: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
a220: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
a230: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
a240: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
a250: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
a260: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
a270: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
a280: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
a290: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
a2a0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
a2b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
a2c0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
a2d0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
a2e0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
a2f0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
a300: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
a310: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
a320: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
a330: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
a340: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
a350: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69  ontent..**.** fi
a360: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20  ndCellPastPtr() 
a370: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78  does the same ex
a380: 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61  cept it skips pa
a390: 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  st the initial.*
a3a0: 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70  * 4-byte child p
a3b0: 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20  ointer found on 
a3c0: 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20  interior pages, 
a3d0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
a3e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a3f0: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
a400: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
a410: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
a420: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
a430: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
a440: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
a450: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
a460: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
a470: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
a480: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
a490: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
a4a0: 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c  llPastPtr(P,I) \
a4b0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66  .  ((P)->aDataOf
a4c0: 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  st + ((P)->maskP
a4d0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
a4e0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
a4f0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a  lIdx[2*(I)])))..
a500: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
a510: 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65  ommon tail proce
a520: 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50  ssing for btreeP
a530: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
a540: 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  d.** btreeParseC
a550: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f  ellPtrIndex() fo
a560: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
a570: 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
a580: 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a  t fit entirely.*
a590: 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d  * on a single B-
a5a0: 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65  tree page.  Make
a5b0: 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
a5c0: 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65  tments to the Ce
a5d0: 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  llInfo.** struct
a5e0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
a5f0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
a600: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
a610: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
a620: 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61  verflow(.  MemPa
a630: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a640: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a650: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a660: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a680: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
a690: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
a6a0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
a6b0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
a6c0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
a6d0: 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
a6e0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
a6f0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
a700: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
a710: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a  age, we have.  *
a720: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
a730: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
a740: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
a750: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
a760: 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70  .  ** overflow p
a770: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
a780: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
a790: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
a7a0: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61   unused.  ** spa
a7b0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
a7c0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
a7d0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
a7e0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
a7f0: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
a800: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
a810: 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ocal..  **.  ** 
a820: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
a830: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
a840: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
a850: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
a860: 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20  y.  ** way will 
a870: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
a880: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
a890: 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ormat..  */.  in
a8a0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
a8b0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
a8c0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
a8d0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
a8e0: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
a8f0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
a900: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
a910: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ally */.  int su
a920: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
a930: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
a940: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
a950: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d   storage */..  m
a960: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a970: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78  >minLocal;.  max
a980: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a990: 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c  axLocal;.  surpl
a9a0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
a9b0: 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
a9c0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
a9d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a9e0: 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63  Size-4);.  testc
a9f0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
aa00: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
aa10: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
aa20: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
aa30: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
aa40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49  xLocal ){.    pI
aa50: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
aa60: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65  16)surplus;.  }e
aa70: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
aa80: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
aa90: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49  nLocal;.  }.  pI
aaa0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
aab0: 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  6)(&pInfo->pPayl
aac0: 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  oad[pInfo->nLoca
aad0: 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b  l] - pCell) + 4;
aae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
aaf0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
ab00: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
ab10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
ab20: 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29  age.xParseCell()
ab30: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
ab40: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
ab50: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
ab60: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
ab70: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
ab80: 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  .**.** btreePars
ab90: 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20  eCellPtr()      
aba0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
abb0: 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a  ee leaf nodes.**
abc0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e   btreeParseCellN
abd0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20  oPayload()  =>  
abe0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74   table btree int
abf0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62  ernal nodes.** b
ac00: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
ac10: 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69  Index()   =>   i
ac20: 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73  ndex btree nodes
ac30: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
ac40: 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66  also a wrapper f
ac50: 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72  unction btreePar
ac60: 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  seCell() that wo
ac70: 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d  rks for.** all M
ac80: 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64  emPage types and
ac90: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
aca0: 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64   the cell by ind
acb0: 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a  ex rather than.*
acc0: 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  * by pointer..*/
acd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
ace0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
acf0: 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61  Payload(.  MemPa
ad00: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
ad10: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
ad20: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
ad30: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ad50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
ad60: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
ad70: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
ad80: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
ad90: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
ada0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
adb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
adc0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
add0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ade0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
adf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ae00: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
ae10: 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66  ze==4 );.#ifndef
ae20: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ae30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ae40: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
ae50: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
ae60: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
ae70: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
ae80: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
ae90: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
aea0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e   = 0;.  pInfo->n
aeb0: 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e  Local = 0;.  pIn
aec0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
aed0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
aee0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
aef0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
af00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
af10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
af20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
af30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
af40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
af50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
af60: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
af70: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
af80: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
af90: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
afa0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
afb0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
afc0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
afd0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
afe0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
aff0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
b000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b010: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
b020: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b040: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
b050: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
b060: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b070: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b080: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b090: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
b0a0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
b0b0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
b0c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
b0d0: 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  eyLeaf );.  asse
b0e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
b0f0: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
b100: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a  pIter = pCell;..
b110: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
b120: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
b130: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
b140: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
b150: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
b160: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
b170: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
b180: 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
b190: 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63   to avoid a func
b1a0: 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a  tion call..  */.
b1b0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
b1c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
b1d0: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
b1e0: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
b1f0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
b200: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
b210: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
b220: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
b230: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
b240: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
b250: 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30  ile( (*pIter)>=0
b260: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
b270: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
b280: 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
b290: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
b2a0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
b2b0: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
b2c0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
b2d0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
b2e0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
b2f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
b300: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
b310: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
b320: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  n call..  */.  i
b330: 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  Key = *pIter;.  
b340: 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29  if( iKey>=0x80 )
b350: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
b360: 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20   &pIter[7];.    
b370: 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20  iKey &= 0x7f;.  
b380: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
b390: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
b3a0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
b3b0: 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66   0x7f);.      if
b3c0: 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20  ( (*pIter)<0x80 
b3d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
b3e0: 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
b3f0: 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
b400: 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b   (iKey<<8) | *++
b410: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62  pIter;.        b
b420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b430: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b    }.  }.  pIter+
b440: 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  +;..  pInfo->nKe
b450: 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79  y = *(i64*)&iKey
b460: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
b470: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
b480: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
b490: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
b4a0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
b4b0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
b4c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b4d0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
b4e0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
b4f0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
b500: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
b510: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
b520: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
b530: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
b540: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
b550: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
b560: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
b570: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
b580: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
b590: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
b5a0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
b5b0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
b5c0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
b5d0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
b5e0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
b5f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
b600: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
b610: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
b620: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
b630: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
b640: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
b650: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
b660: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
b670: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
b680: 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ex(.  MemPage *p
b690: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
b6a0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
b6b0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
b6c0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
b6d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b6e0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
b6f0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
b700: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b710: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b720: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b730: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
b740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
b750: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
b760: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
b770: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
b780: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b790: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
b7a0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
b7b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b7c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b7d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b7f0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
b800: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
b810: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
b820: 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a  ntKeyLeaf==0 );.
b830: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
b840: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
b850: 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
b860: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
b870: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
b880: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
b890: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
b8a0: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
b8b0: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
b8c0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
b8d0: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
b8e0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
b8f0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
b900: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
b910: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
b920: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e    pIter++;.  pIn
b930: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
b940: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  oad;.  pInfo->nP
b950: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
b960: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
b970: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
b980: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
b990: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
b9a0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
b9b0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
b9c0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
b9d0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
b9e0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
b9f0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
ba00: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
ba10: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
ba20: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
ba30: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
ba40: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
ba50: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
ba60: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
ba70: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
ba80: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
ba90: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
baa0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
bab0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
bac0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
bad0: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
bae0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
baf0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
bb00: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
bb10: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
bb20: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
bb30: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
bb40: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
bb50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
bb60: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
bb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bb80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bb90: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
bba0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
bbb0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
bbc0: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
bbd0: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
bbe0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
bbf0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
bc00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
bc10: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  ){.  pPage->xPar
bc20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69  seCell(pPage, fi
bc30: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
bc40: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
bc60: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
bc70: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
bc80: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
bc90: 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65  .xCellSize.** me
bca0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  thod..**.** Comp
bcb0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
bcc0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
bcd0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
bce0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
bcf0: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
bd00: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
bd10: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
bd20: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
bd30: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
bd40: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
bd50: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
bd60: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
bd70: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
bd80: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
bd90: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  l pointer..**.**
bda0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
bdb0: 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20  yload()    =>   
bdc0: 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  table internal n
bdd0: 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  odes.** cellSize
bde0: 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20  Ptr()           
bdf0: 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78    =>   all index
be00: 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c   nodes & table l
be10: 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61  eaf nodes.*/.sta
be20: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
be30: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
be40: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
be50: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
be60: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
be70: 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f  ldPtrSize; /* Fo
be80: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
be90: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
bea0: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bed0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
bee0: 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53  rint */.  u32 nS
bef0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65     /* Size value
bf20: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23   to return */..#
bf30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
bf40: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
bf50: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
bf60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
bf70: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
bf80: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
bf90: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
bfa0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
bfb0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
bfc0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
bfd0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
bfe0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
bff0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
c000: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
c010: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
c020: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
c030: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
c040: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
c050: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
c060: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
c070: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
c080: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
c090: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
c0a0: 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65  .  nSize = *pIte
c0b0: 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d  r;.  if( nSize>=
c0c0: 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64  0x80 ){.    pEnd
c0d0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
c0e0: 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b    nSize &= 0x7f;
c0f0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
c100: 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37  Size = (nSize<<7
c110: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
c120: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
c130: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
c140: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
c150: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
c160: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
c170: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
c180: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
c190: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
c1a0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
c1b0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
c1c0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
c1d0: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
c1e0: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
c1f0: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
c200: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
c210: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
c220: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
c230: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
c240: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
c250: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
c260: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
c270: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
c280: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
c290: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
c2a0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
c2b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
c2c0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
c2d0: 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d  f( nSize<=pPage-
c2e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
c2f0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
c300: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
c310: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
c320: 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d  ) nSize = 4;.  }
c330: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69  else{.    int mi
c340: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
c350: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
c360: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
c370: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
c380: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
c390: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c3a0: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
c3b0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
c3c0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
c3d0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
c3e0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
c3f0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
c400: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
c410: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
c420: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
c430: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
c440: 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65  = 4 + (u16)(pIte
c450: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  r - pCell);.  }.
c460: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
c470: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
c480: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
c490: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
c4a0: 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20  nSize;.}.static 
c4b0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  u16 cellSizePtrN
c4c0: 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65  oPayload(MemPage
c4d0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
c4e0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
c4f0: 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a   = pCell + 4; /*
c500: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
c510: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
c520: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
c550: 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  arint */..#ifdef
c560: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c570: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
c580: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
c590: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
c5a0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
c5b0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
c5c0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
c5d0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
c5e0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
c5f0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
c600: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
c610: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
c620: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
c630: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
c640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
c650: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
c660: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
c670: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
c680: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
c690: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
c6a0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c6b0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
c6c0: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  o);.#else.  UNUS
c6d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
c6e0: 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ge);.#endif..  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
c700: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
c710: 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20  .  pEnd = pIter 
c720: 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  + 9;.  while( (*
c730: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
c740: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
c750: 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e   assert( debugin
c760: 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28  fo.nSize==(u16)(
c770: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c  pIter - pCell) |
c780: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
c790: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
c7a0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d  Iter - pCell);.}
c7b0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
c7c0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
c7d0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
c7e0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
c7f0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
c800: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
c810: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
c820: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
c830: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c840: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
c850: 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c  turn pPage->xCel
c860: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e  lSize(pPage, fin
c870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
c880: 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ll));.}.#endif..
c890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c8a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
c8b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
c8c0: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
c8d0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
c8e0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
c8f0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
c900: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
c910: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
c920: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
c930: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
c940: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
c950: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66  oid ptrmapPutOvf
c960: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
c970: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20  age, u8 *pCell, 
c980: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c  int *pRC){.  Cel
c990: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66  lInfo info;.  if
c9a0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
c9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
c9c0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  !=0 );.  pPage->
c9d0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
c9e0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
c9f0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63  .  if( info.nLoc
ca00: 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
ca10: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
ca20: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
ca30: 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell[info.nSize-4
ca40: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
ca50: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
ca60: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
ca70: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
ca80: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
ca90: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
caa0: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
cab0: 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f  e given. This ro
cac0: 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65  utine reorganize
cad0: 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  s cells within t
cae0: 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68  he.** page so th
caf0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
cb00: 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74  free-blocks on t
cb10: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  he free-block li
cb20: 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  st..**.** Parame
cb30: 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20  ter nMaxFrag is 
cb40: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
cb50: 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  nt of fragmented
cb60: 20 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20   space that may 
cb70: 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
cb80: 20 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20   the page after 
cb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
cba0: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  urns..**.** EVID
cbb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
cbc0: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
cbd0: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
cbe0: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
cbf0: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
cc00: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
cc10: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
cc20: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
cc30: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
cc40: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
cc50: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
cc60: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
cc70: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
cc80: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
cc90: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
cca0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
ccb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ccc0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
ccd0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
cce0: 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20  nt nMaxFrag){.  
ccf0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
cd00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
cd10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
cd20: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
cd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
cd40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
cd50: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
cd60: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
cd70: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
cd80: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
cd90: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
cda0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
cdb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
cdc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
cdd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
cde0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cdf0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
ce00: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
ce10: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
ce20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ce30: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
ce40: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
ce50: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
ce80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ce90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
cec0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
ced0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cee0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
cef0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
cf00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
cf10: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
cf20: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
cf30: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
cf40: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cf50: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
cf60: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
cf70: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
cf80: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
cf90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
cfa0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
cfb0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
cfc0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
cfd0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
cfe0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
cff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
d000: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d010: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d020: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d030: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d050: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d060: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
d070: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
d080: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d090: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
d0a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0c0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0d0: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
d0e0: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
d0f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
d100: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d110: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
d120: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
d130: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
d140: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
d150: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
d160: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d170: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c  dr+3]) );.  iCel
d180: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
d190: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
d1a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
d1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1c0: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Size;..  /* This
d1d0: 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70   block handles p
d1e0: 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72  ages with two or
d1f0: 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63   fewer free bloc
d200: 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a  ks and nMaxFrag.
d210: 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72    ** or fewer fr
d220: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20  agmented bytes. 
d230: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
d240: 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76  is faster to mov
d250: 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28  e the.  ** two (
d260: 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f  or one) blocks o
d270: 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65  f cells using me
d280: 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20  mmove() and add 
d290: 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a  the required.  *
d2a0: 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63  * offsets to eac
d2b0: 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  h pointer in the
d2c0: 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
d2d0: 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74  ray than it is t
d2e0: 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72  o .  ** reconstr
d2f0: 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70  uct the entire p
d300: 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  age.  */.  if( (
d310: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c  int)data[hdr+7]<
d320: 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20  =nMaxFrag ){.   
d330: 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74   int iFree = get
d340: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d350: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  1]);.    if( iFr
d360: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
d370: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
d380: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
d390: 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46  ..      /* pageF
d3a0: 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c  indSlot() has al
d3b0: 72 65 61 64 79 20 76 65 72 69 66 69 65 64 20 74  ready verified t
d3c0: 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  hat free blocks 
d3d0: 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20  are sorted.     
d3e0: 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20   ** in order of 
d3f0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  offset within th
d400: 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74  e page, and that
d410: 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64   no block extend
d420: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20  s.      ** past 
d430: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
d440: 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68  age. Provided th
d450: 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73  e two free slots
d460: 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a   do not .      *
d470: 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20  * overlap, this 
d480: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
d490: 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61  the memmove() ca
d4a0: 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  lls below will n
d4b0: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ot.      ** over
d4c0: 77 72 69 74 65 20 74 68 65 20 75 73 61 62 6c 65  write the usable
d4d0: 53 69 7a 65 20 62 79 74 65 20 62 75 66 66 65 72  Size byte buffer
d4e0: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61  , even if the da
d4f0: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
d500: 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e    ** is corrupt.
d510: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
d520: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
d530: 69 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a  iFree2>iFree );.
d540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
d550: 72 65 65 2b 67 65 74 32 62 79 74 65 28 26 64 61  ree+get2byte(&da
d560: 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20  ta[iFree+2]) <= 
d570: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d580: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
d590: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b  e2==0 || iFree2+
d5a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d5b0: 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61  Free2+2]) <= usa
d5c0: 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  bleSize );..    
d5d0: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
d5e0: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
d5f0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
d600: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
d610: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
d620: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d630: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
d640: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
d650: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
d660: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
d670: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
d680: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
d690: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
d6a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d6b0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
d6c0: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
d6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
d6e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d6f0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d710: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
d730: 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69 46 72  t( iFree+sz<=iFr
d740: 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69 66 69  ee2 ); /* Verifi
d750: 65 64 20 62 79 20 70 61 67 65 46 69 6e 64 53 6c  ed by pageFindSl
d760: 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ot() */.        
d770: 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65    sz2 = get2byte
d780: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
d790: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
d7a0: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a  ert( iFree+sz+sz
d7b0: 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  2+iFree2-(iFree+
d7c0: 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  sz) <= usableSiz
d7d0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  e );.          m
d7e0: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72  emmove(&data[iFr
d7f0: 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74  ee+sz+sz2], &dat
d800: 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72  a[iFree+sz], iFr
d810: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b  ee2-(iFree+sz));
d820: 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d  .          sz +=
d830: 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz2;.        }.
d840: 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74          cbrk = t
d850: 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  op+sz;.        a
d860: 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72  ssert( cbrk+(iFr
d870: 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c  ee-top) <= usabl
d880: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
d890: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63   memmove(&data[c
d8a0: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d  brk], &data[top]
d8b0: 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20  , iFree-top);.  
d8c0: 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d        for(pAddr=
d8d0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d8e0: 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70  ]; pAddr<pEnd; p
d8f0: 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20  Addr+=2){.      
d900: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d910: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  e(pAddr);.      
d920: 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65 65      if( pc<iFree
d930: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
d940: 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20  dr, pc+sz); }.  
d950: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
d960: 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75   pc<iFree2 ){ pu
d970: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
d980: 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20  +sz2); }.       
d990: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
d9a0: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a  defragment_out;.
d9b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d9c0: 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  }..  cbrk = usab
d9d0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c  leSize;.  iCellL
d9e0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
d9f0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
da00: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
da10: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
da20: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
da30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
da40: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
da50: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
da60: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
da70: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
da80: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
da90: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
daa0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
dab0: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
dac0: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
dad0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
dae0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
daf0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
db00: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
db10: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
db20: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
db30: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
db40: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
db50: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
db60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
db70: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
db80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
db90: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
dba0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
dbb0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
dbc0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
dbd0: 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  e(pPage, &src[pc
dbe0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
dbf0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
dc00: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
dc10: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
dc20: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
dc30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
dc40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
dc50: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
dc60: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
dc70: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
dc80: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
dc90: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
dca0: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
dcb0: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
dcc0: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
dcd0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
dce0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
dcf0: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
dd00: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
dd10: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
dd20: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
dd30: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
dd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
dd50: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
dd60: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
dd70: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
dd80: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
dd90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
dda0: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
ddb0: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
ddc0: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
ddd0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
dde0: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
ddf0: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
de00: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
de10: 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72  r+7] = 0;.. defr
de20: 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66  agment_out:.  if
de30: 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62  ( data[hdr+7]+cb
de40: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
de50: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
de60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
de70: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
de80: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
de90: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
dea0: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
deb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
dec0: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
ded0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
dee0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
def0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
df00: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
df10: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
df20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
df30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
df40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
df50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
df60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
df70: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
df80: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
df90: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
dfa0: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
dfb0: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
dfc0: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
dfd0: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
dfe0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
dff0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
e000: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
e010: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
e020: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
e030: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
e040: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
e050: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
e060: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
e070: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
e080: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
e090: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
e0a0: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
e0b0: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
e0c0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
e0d0: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
e0e0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
e0f0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
e100: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
e110: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
e120: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
e130: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
e140: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
e150: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
e160: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
e170: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
e180: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
e190: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
e1a0: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
e1b0: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
e1c0: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
e1d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
e1e0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
e1f0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
e200: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
e210: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
e220: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
e230: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
e240: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
e250: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
e260: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
e270: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
e280: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
e290: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
e2a0: 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ize;.  int size;
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e2c0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
e2d0: 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  slot */..  asser
e2e0: 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69  t( pc>0 );.  whi
e2f0: 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69  le( pc<=usableSi
e300: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45  ze-4 ){.    /* E
e310: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
e320: 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68  710-53328 The th
e330: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62  ird and fourth b
e340: 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20  ytes of each.   
e350: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f   ** freeblock fo
e360: 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  rm a big-endian 
e370: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e380: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e390: 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a   freeblock.    *
e3a0: 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c  * in bytes, incl
e3b0: 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65  uding the 4-byte
e3c0: 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
e3d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
e3e0: 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  &aData[pc+2]);. 
e3f0: 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65     if( (x = size
e400: 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a   - nByte)>=0 ){.
e410: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e420: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65  x==4 );.      te
e430: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
e440: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 2b 70        if( size+p
e450: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
e460: 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  {.        *pRc =
e470: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e480: 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20  PAGE(pPg);.     
e490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e4a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34     }else if( x<4
e4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
e4c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
e4d0: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
e4e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
e4f0: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
e500: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
e510: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
e520: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
e530: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
e540: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
e550: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
e560: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
e570: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e580: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
e590: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
e5a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
e5b0: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
e5c0: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
e5d0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
e5e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
e5f0: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
e600: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
e610: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
e620: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
e630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e640: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
e650: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
e660: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
e670: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
e680: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
e690: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
e6a0: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
e6b0: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
e6c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
e6d0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
e6e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
e6f0: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
e700: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
e710: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
e720: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
e730: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[pc]);.    if( 
e740: 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 20  pc<iAddr+size ) 
e750: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
e760: 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52 63 20   pc ){.    *pRc 
e770: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
e780: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a  _PAGE(pPg);.  }.
e790: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e7a0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
e7b0: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
e7c0: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
e7d0: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
e7e0: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
e7f0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
e800: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
e810: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
e820: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
e830: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
e840: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
e850: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
e860: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
e870: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
e880: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
e890: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
e8a0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
e8b0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
e8c0: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
e8d0: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
e8e0: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
e8f0: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
e900: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
e910: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
e920: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
e930: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
e940: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
e950: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
e960: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
e970: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
e980: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
e990: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
e9a0: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
e9b0: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
e9c0: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
e9d0: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
e9e0: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
e9f0: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
ea00: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
ea10: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
ea20: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
ea30: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
ea40: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
ea50: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
ea60: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
ea70: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
ea80: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ea90: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
eaa0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
eab0: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
eac0: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
ead0: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
eae0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
eaf0: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
eb00: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
eb30: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
eb40: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
eb50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eb60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
eb70: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
eb80: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
eb90: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
eba0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ebb0: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
ebc0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
ebd0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
ebe0: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
ebf0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
ec00: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ec10: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ec20: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
ec30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ec40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ec50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
ec60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
ec70: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
ec80: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
ec90: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
eca0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
ecb0: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
ecc0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
ecd0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
ece0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
ecf0: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
ed00: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
ed10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ed20: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
ed30: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
ed40: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
ed50: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
ed60: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
ed70: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
ed80: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
ed90: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
eda0: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
edb0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
edc0: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
edd0: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
ede0: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
edf0: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
ee00: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
ee10: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
ee20: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
ee30: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ee40: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
ee50: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
ee60: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
ee70: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
ee80: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
ee90: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
eea0: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
eeb0: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
eec0: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
eed0: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
eee0: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
eef0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
ef00: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
ef10: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
ef20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ef30: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
ef40: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
ef50: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
ef60: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
ef70: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
ef80: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ef90: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
efa0: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
efb0: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
efc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efd0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
efe0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
eff0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
f000: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
f010: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
f020: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
f030: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
f040: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
f050: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
f060: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
f070: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
f080: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
f090: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
f0a0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
f0b0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
f0c0: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
f0d0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
f0e0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
f0f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
f100: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
f110: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
f120: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
f130: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
f140: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
f150: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
f160: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
f170: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
f180: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
f190: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
f1a0: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
f1b0: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
f1c0: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
f1d0: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
f1e0: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
f1f0: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
f200: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f210: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
f220: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
f230: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
f240: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
f250: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
f260: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
f270: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
f280: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
f290: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
f2a0: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
f2b0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
f2c0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
f2d0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
f2e0: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
f2f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f300: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
f310: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
f320: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
f330: 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c  ge(pPage, MIN(4,
f340: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
f350: 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20  (2+nByte)));.   
f360: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
f370: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
f380: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f390: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f3a0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b    assert( gap+2+
f3b0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
f3c0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
f3d0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
f3e0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
f3f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
f400: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
f410: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f420: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
f430: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
f440: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
f450: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
f460: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
f470: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
f480: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
f490: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
f4a0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
f4b0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
f4c0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
f4d0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
f4e0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
f4f0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
f500: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
f510: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
f520: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
f530: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
f540: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
f550: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
f560: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
f570: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
f580: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
f590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
f5b0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
f5c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
f5d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
f5e0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
f5f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
f600: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
f610: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
f620: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
f630: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
f640: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
f650: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
f660: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
f670: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
f680: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
f690: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
f6a0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
f6b0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
f6c0: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
f6d0: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
f6e0: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
f6f0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
f700: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
f710: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
f720: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
f730: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
f740: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
f750: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
f760: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
f770: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
f780: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
f790: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
f7a0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
f7b0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
f7c0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
f7d0: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
f7e0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
f7f0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
f800: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
f810: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
f820: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f850: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
f860: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
f870: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
f880: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f8a0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
f8b0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
f8c0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
f8f0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
f900: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
f910: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
f940: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
f950: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
f960: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
f970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
f980: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
f990: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78  iSize */.  u16 x
f9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
f9d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f9e0: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
f9f0: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
fa00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
fa10: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
fa20: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
fa30: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
fa40: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
fa50: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
fa60: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
fa70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fa80: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
fa90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
faa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
fab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
fac0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
fad0: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
fae0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
faf0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
fb00: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
fb10: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
fb20: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
fb30: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fb40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fb50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fb60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
fb70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
fb80: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
fb90: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
fba0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
fbb0: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61  ert( iStart<=pPa
fbc0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
fbd0: 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54  ize-4 );..  /* T
fbe0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
fbf0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
fc00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
fc10: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
fc20: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
fc30: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
fc40: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
fc50: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
fc60: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fc70: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
fc80: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
fc90: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
fca0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
fcb0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
fcc0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
fcd0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
fce0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
fcf0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
fd00: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
fd10: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
fd20: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
fd30: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
fd40: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
fd50: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
fd60: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
fd70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fd80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fd90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
fda0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
fdb0: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
fdc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fdd0: 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e  iFreeBlk>pPage->
fde0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
fdf0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
fe00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fe10: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
fe20: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
fe30: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
fe40: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
fe50: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
fe60: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
fe70: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
fe80: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
fe90: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
fea0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
feb0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
fec0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
fed0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
fee0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
fef0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
ff00: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
ff10: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
ff20: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
ff30: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
ff40: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
ff50: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
ff60: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
ff70: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
ff80: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
ff90: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
ffa0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ffb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ffc0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64  age);.      iEnd
ffd0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
ffe0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
fff0: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
10000 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
10010 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
10020 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
10030 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10040 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10060 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
10070 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
10080 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
10090 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
100a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
100b0 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
100c0 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
100d0 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
100e0 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
100f0 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
10100 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
10110 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
10120 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
10130 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
10140 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
10150 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
10160 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
10170 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
10180 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
10190 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
101a0 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
101b0 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
101c0 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
101d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
101e0 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
101f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10200 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10210 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  ge);.        nFr
10220 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
10230 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
10240 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
10250 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
10260 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
10270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10280 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
10290 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
102a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
102b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74  (pPage);.    dat
102c0 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
102d0 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74  g;.  }.  x = get
102e0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
102f0 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72  5]);.  if( iStar
10300 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t<=x ){.    /* T
10310 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
10320 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
10330 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
10340 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
10350 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
10360 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
10370 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
10380 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
10390 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
103a0 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
103b0 20 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20     if( iStart<x 
103c0 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  || iPtr!=hdr+1 )
103d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
103e0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
103f0 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
10400 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
10410 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
10420 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
10430 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
10440 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
10450 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
10460 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
10470 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
10480 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
10490 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d  r], iStart);.  }
104a0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
104b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
104c0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
104d0 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
104e0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
104f0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
10500 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
10510 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
10520 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
10530 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
10540 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
10550 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
10560 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
10570 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
10580 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
10590 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
105a0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
105b0 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
105c0 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
105d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
105e0 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
105f0 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
10600 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
10610 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
10620 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
10630 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
10640 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
10650 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
10660 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
10670 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
10680 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
10690 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
106a0 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
106b0 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
106c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
106d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
106e0 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
106f0 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
10700 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
10710 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
10720 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
10730 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
10740 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
10750 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
10760 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
10770 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
10780 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
10790 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
107a0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
107b0 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
107c0 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
107d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
107e0 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
107f0 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
10800 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
10810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10820 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
10830 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
10840 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
10850 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
10860 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
10870 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
10880 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
10890 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
108a0 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
108b0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
108c0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
108d0 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
108e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
108f0 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
10900 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
10910 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
10920 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10930 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
10940 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
10950 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
10960 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
10970 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
10980 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
10990 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
109a0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
109b0 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
109c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
109d0 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
109e0 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
109f0 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
10a00 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
10a10 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
10a20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10a30 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
10a40 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
10a50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
10a60 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
10a70 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
10a80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
10a90 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
10aa0 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
10ab0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
10ac0 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
10ad0 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
10ae0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
10af0 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
10b00 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
10b10 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
10b20 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
10b30 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
10b40 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
10b50 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
10b60 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
10b70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
10b80 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
10b90 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
10ba0 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
10bb0 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
10bc0 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
10bd0 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
10be0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
10bf0 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
10c00 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
10c10 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
10c20 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
10c30 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
10c40 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
10c50 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
10c60 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
10c70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10c80 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
10c90 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
10ca0 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
10cb0 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
10cc0 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
10cd0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
10ce0 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
10cf0 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
10d00 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
10d10 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
10d20 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
10d30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
10d40 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
10d50 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
10d60 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
10d70 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
10d80 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
10d90 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
10da0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
10db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
10dc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
10dd0 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
10de0 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
10df0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
10e00 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
10e10 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
10e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10e30 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10e40 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
10e50 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
10e60 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
10e70 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
10e80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10e90 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
10ea0 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
10eb0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
10ec0 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
10ed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10ee0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
10ef0 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
10f00 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
10f10 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
10f20 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
10f30 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
10f40 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
10f50 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
10f60 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
10f70 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
10f80 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
10f90 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
10fa0 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
10fb0 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
10fc0 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
10fd0 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
10fe0 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
10ff0 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
11000 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11010 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  e){.  int pc;   
11020 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
11030 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
11040 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
11050 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
11060 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
11070 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
11080 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
11090 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
110a0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
110b0 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
110c0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
110d0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
110e0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
110f0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
11100 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
11110 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
11120 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
11130 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
11140 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65  .  u16 cellOffse
11150 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
11160 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
11170 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
11180 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
11190 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
111a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
111b0 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
111c0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
111d0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
111e0 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
111f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
11200 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
11210 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
11220 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
11230 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
11240 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
11250 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
11260 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
11270 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
11280 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
11290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
112a0 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
112b0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
112c0 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
112d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
112e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
112f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11300 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
11310 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
11320 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11330 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11340 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
11350 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11360 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
11370 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
11380 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
11390 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
113a0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
113b0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
113c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
113d0 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  t==0 );..  pBt =
113e0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68   pPage->pBt;.  h
113f0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
11400 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
11410 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
11420 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11430 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
11440 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
11450 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
11460 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  cating.  ** the 
11470 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
11480 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64  . */.  if( decod
11490 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
114a0 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20  ta[hdr]) ){.    
114b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
114c0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
114d0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
114e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
114f0 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
11500 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
11510 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
11520 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
11530 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
11540 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11550 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
11560 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
11570 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
11580 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
11590 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
115a0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
115b0 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  rSize;.  pPage->
115c0 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
115d0 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
115e0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
115f0 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
11600 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  et];.  pPage->aD
11610 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b  ataOfst = &data[
11620 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
11630 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45  ize];.  /* EVIDE
11640 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
11650 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
11660 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
11670 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
11680 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  s.  ** the start
11690 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
116a0 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
116b0 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
116c0 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a   integer is.  **
116d0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
116e0 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20  65536. */.  top 
116f0 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
11700 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
11710 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
11720 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
11730 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
11740 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
11750 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
11760 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
11770 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
11780 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
11790 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
117a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
117b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
117c0 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
117d0 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
117e0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
117f0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
11800 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
11810 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
11820 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
11830 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74  (pPage);.  }.  t
11840 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
11850 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
11860 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  Bt) );.  /* EVID
11870 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
11880 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
11890 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
118a0 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
118b0 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
118c0 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
118d0 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
118e0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
118f0 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  ) then the.  ** 
11900 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
11910 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11920 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
11930 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
11940 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  he.  ** bytes of
11950 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
11960 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11970 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
11980 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
11990 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
119a0 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d  ..  /* A malform
119b0 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
119c0 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
119d0 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
119e0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67   end.  ** of pag
119f0 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
11a00 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20   cell.  .  **.  
11a10 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11a20 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
11a30 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
11a40 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
11a50 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74  ends.  ** past t
11a60 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
11a70 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
11a80 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
11a90 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  UPT to be .  ** 
11aa0 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
11ab0 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c  oes..  */.  iCel
11ac0 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
11ad0 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
11ae0 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
11af0 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
11b00 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64   4;.  if( pBt->d
11b10 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
11b20 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a  E_CellSizeCk ){.
11b30 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
11b40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
11b50 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
11b60 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
11b70 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
11b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
11b90 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66   cell */..    if
11ba0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
11bb0 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
11bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
11bd0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
11be0 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32  .      pc = get2
11bf0 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
11c00 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
11c10 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
11c20 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
11c30 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  st );.      test
11c40 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
11c50 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ast );.      if(
11c60 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
11c70 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
11c80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11c90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11ca0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
11cb0 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20     }.      sz = 
11cc0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
11cd0 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
11ce0 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
11cf0 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
11d00 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
11d10 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
11d20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d40 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
11d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11d60 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
11d70 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
11d80 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  ++;.  }  ..  /* 
11d90 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
11da0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
11db0 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
11dc0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
11dd0 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
11de0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
11df0 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
11e00 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
11e10 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
11e20 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
11e30 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
11e40 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
11e50 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
11e60 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
11e70 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
11e80 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
11e90 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
11ea0 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
11eb0 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
11ec0 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
11ed0 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
11ee0 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
11ef0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
11f00 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
11f10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
11f20 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
11f30 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
11f40 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
11f50 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
11f60 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
11f70 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
11f80 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
11f90 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
11fa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11fb0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
11fc0 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20  Page); .    }.  
11fd0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
11fe0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
11ff0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
12000 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
12010 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
12020 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
12030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12040 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
12050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12060 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
12070 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
12080 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
12090 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
120a0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
120b0 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
120c0 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
120d0 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
120e0 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
120f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12100 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
12110 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
12120 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
12130 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
12140 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12150 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
12160 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b     }.    if( pc+
12170 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
12180 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
12190 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66  .      /* Last f
121a0 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  reeblock extends
121b0 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a   past page end *
121c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
121d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
121e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
121f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
12200 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
12210 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
12220 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
12230 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
12240 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
12250 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
12260 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
12270 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
12280 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
12290 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
122a0 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
122b0 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
122c0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
122d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
122e0 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
122f0 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
12300 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
12310 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
12320 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
12330 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
12340 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
12350 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
12360 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
12370 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
12380 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
12390 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
123a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  bleSize ){.    r
123b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
123c0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
123d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
123e0 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
123f0 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
12400 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
12410 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
12420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12430 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
12440 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
12450 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
12460 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
12470 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
12480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12490 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
124a0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
124b0 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
124c0 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
124d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
124e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
124f0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
12500 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
12510 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
12520 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
12530 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12540 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
12550 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
12560 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12570 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12580 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12590 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
125a0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
125b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
125c0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
125d0 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
125e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
125f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
12600 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
12610 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
12620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12630 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12640 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
12650 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
12660 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20  T_SECURE ){.    
12670 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
12680 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
12690 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
126a0 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
126b0 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
126c0 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
126d0 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
126e0 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
126f0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
12700 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
12710 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
12720 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
12730 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
12740 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
12750 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
12760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
12770 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
12780 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
12790 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
127a0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
127b0 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
127c0 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
127d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
127e0 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
127f0 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
12800 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
12810 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
12820 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
12830 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
12840 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
12850 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
12860 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
12870 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
12880 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
12890 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
128a0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
128b0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
128c0 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
128d0 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
128e0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
128f0 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
12900 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
12910 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
12920 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
12930 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
12940 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
12950 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
12960 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
12970 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
12980 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
12990 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
129a0 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
129b0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
129c0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
129d0 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
129e0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
129f0 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
12a00 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
12a10 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
12a20 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
12a30 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
12a40 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
12a50 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
12a60 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
12a70 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
12a80 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
12a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12aa0 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
12ab0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
12ac0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
12ad0 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
12ae0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
12af0 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
12b00 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
12b10 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
12b20 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
12b30 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
12b40 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
12b50 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
12b60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
12b70 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12b80 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
12b90 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
12ba0 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
12bb0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
12bc0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
12bd0 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
12be0 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
12bf0 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
12c00 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
12c10 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
12c20 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
12c30 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
12c40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
12c50 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
12c60 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
12c70 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
12c80 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
12c90 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
12ca0 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
12cb0 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
12cc0 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
12cd0 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
12ce0 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
12cf0 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
12d00 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12d10 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12d20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12d30 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12d40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12d50 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
12d60 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
12d70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
12d80 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
12d90 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
12da0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
12db0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12dc0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12dd0 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12de0 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12df0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
12e00 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
12e10 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
12e20 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
12e30 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
12e40 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
12e50 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
12e60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12e80 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
12e90 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
12ea0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
12eb0 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
12ec0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
12ed0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12ee0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
12ef0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
12f00 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
12f10 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
12f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12f30 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
12f40 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
12f50 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
12f60 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
12f70 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
12f80 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
12f90 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
12fa0 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
12fb0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
12fc0 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
12fd0 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
12fe0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12ff0 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
13000 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
13010 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
13020 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
13030 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
13040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13050 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
13060 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
13070 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
13080 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
13090 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
130a0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
130b0 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
130c0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
130d0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
130e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
130f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
13100 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
13110 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
13120 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
13130 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
13140 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
13150 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
13160 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
13170 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
13180 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
13190 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
131a0 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
131b0 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
131c0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
131d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
131e0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
131f0 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
13200 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
13210 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
13220 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
13230 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
13240 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
13250 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
13260 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
13270 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
13280 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
13290 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
132a0 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
132b0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
132c0 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
132d0 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
132e0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
132f0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
13300 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
13310 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
13320 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
13330 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
13340 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
13350 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
13360 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
13370 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
13380 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
13390 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
133a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
133b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
133c0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
133d0 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
133e0 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
133f0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
13400 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
13410 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
13420 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
13430 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
13440 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
13450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
13470 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
134a0 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
134b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
134c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
134d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
134e0 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
134f0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
13500 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
13510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13520 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
13530 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
13540 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
13550 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
13560 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
13570 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
13580 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
13590 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
135a0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
135b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
135c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
135d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
135e0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
135f0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
13600 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
13610 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70   || bReadOnly==p
13620 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
13630 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gs );.  assert( 
13640 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  pCur==0 || pCur-
13650 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69  >iPage>0 );..  i
13660 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
13670 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
13680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13690 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
136a0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
136b0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
136c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
136d0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
136e0 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
136f0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
13700 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
13710 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
13720 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
13730 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  ror;.  }.  *ppPa
13740 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
13750 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
13760 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
13770 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
13780 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
13790 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
137a0 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
137b0 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20  o, pBt);.    rc 
137c0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
137d0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
137e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137f0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
13800 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
13810 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64       goto getAnd
13820 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
13830 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
13840 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
13850 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
13860 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
13870 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
13880 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
13890 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Page) );..  /* I
138a0 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68  f obtaining a ch
138b0 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63  ild page for a c
138c0 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76  ursor, we must v
138d0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
138e0 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  age is.  ** comp
138f0 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
13900 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  root page. */.  
13910 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70  if( pCur && ((*p
13920 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
13930 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
13940 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
13950 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63  ntKey) ){.    rc
13960 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13970 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20  T_PGNO(pgno);.  
13980 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
13990 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f  pPage);.    goto
139a0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
139b0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  error;.  }.  ret
139c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
139d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
139e0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72  rror:.  if( pCur
139f0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
13a00 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d  age--;.    pCur-
13a10 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
13a20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
13a30 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  e];.  }.  testca
13a40 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
13a50 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
13a60 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
13a70 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
13a80 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
13a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
13aa0 4e 43 55 52 52 45 4e 54 0a 2f 2a 20 0a 2a 2a 20  NCURRENT./* .** 
13ab0 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13ac0 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 67 6e   the MemPage.pgn
13ad0 6f 52 6f 6f 74 20 76 61 72 69 61 62 6c 65 2c 20  oRoot variable, 
13ae0 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2f  if it exists..*/
13af0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13b00 4d 65 6d 70 61 67 65 52 6f 6f 74 28 4d 65 6d 50  MempageRoot(MemP
13b10 61 67 65 20 2a 70 50 67 2c 20 75 33 32 20 70 67  age *pPg, u32 pg
13b20 6e 6f 52 6f 6f 74 29 7b 0a 20 20 70 50 67 2d 3e  noRoot){.  pPg->
13b30 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 67 6e 6f 52  pgnoRoot = pgnoR
13b40 6f 6f 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  oot;.}.#else.# d
13b50 65 66 69 6e 65 20 73 65 74 4d 65 6d 70 61 67 65  efine setMempage
13b60 52 6f 6f 74 28 78 2c 79 29 0a 23 65 6e 64 69 66  Root(x,y).#endif
13b70 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
13b80 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
13b90 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
13ba0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
13bb0 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
13bc0 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
13bd0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
13be0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
13bf0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
13c00 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
13c10 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
13c20 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
13c30 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
13c40 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
13c50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
13c60 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
13c70 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
13c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
13c90 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
13ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13cb0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
13cc0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
13cd0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
13ce0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13cf0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
13d00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
13d10 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
13d20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13d30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
13d40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
13d50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
13d60 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
13d70 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
13d80 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
13d90 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
13da0 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
13db0 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
13dc0 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
13dd0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13de0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
13df0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
13e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
13e10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13e20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
13e30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
13e40 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
13e50 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
13e60 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13e80 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
13e90 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
13ea0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
13eb0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
13ec0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
13ed0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
13ee0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
13ef0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13f00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
13f10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
13f20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
13f30 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
13f40 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
13f50 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
13f60 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
13f70 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
13f80 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
13f90 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
13fa0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
13fb0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
13fc0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
13fd0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
13fe0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
13ff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
14000 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
14010 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
14020 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
14030 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
14040 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
14050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14060 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
14070 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
14080 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
14090 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
140a0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
140b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
140c0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
140d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
140e0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
140f0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
14100 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
14110 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
14120 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
14130 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
14140 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
14150 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
14160 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
14170 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
14180 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
14190 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
141a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
141b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
141c0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
141d0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
141e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
141f0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
14200 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
14210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14220 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14230 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
14240 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
14250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
14260 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
14270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
14280 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
14290 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
142a0 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
142b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
142c0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
142d0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
142e0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
142f0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
14300 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
14310 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
14320 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
14330 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
14340 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14350 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
14360 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
14370 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
14380 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
14390 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
143a0 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
143b0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
143c0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
143d0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
143e0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
143f0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
14400 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
14410 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
14420 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
14430 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
14440 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
14450 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
14460 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
14470 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
14480 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14490 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
144a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
144b0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
144c0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
144d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
144e0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
144f0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
14500 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
14510 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
14520 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
14530 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
14540 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
14550 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
14560 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
14570 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
14580 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
14590 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
145a0 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
145b0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
145c0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
145d0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
145e0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
145f0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
14600 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
14610 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
14620 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
14630 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
14640 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
14650 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
14660 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
14670 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
14680 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
14690 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
146a0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
146b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
146c0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
146d0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
146e0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
146f0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
14700 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
14710 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
14720 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
14730 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
14740 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
14750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14760 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14770 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
14780 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14790 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
147a0 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
147b0 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
147e0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
147f0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
14800 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
14810 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
14820 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
14830 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
14840 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
14850 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
14860 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
14870 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
14880 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
14890 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
148a0 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
148b0 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
148c0 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
148d0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
148e0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
148f0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
14900 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
14910 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
14920 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
14930 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
14940 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14950 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
14960 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
14970 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
14980 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
14990 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
149a0 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
149b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
149c0 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
149d0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
149e0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
149f0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
14a00 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
14a10 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
14a20 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
14a30 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
14a40 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
14a50 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
14a60 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
14a70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
14a80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14a90 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
14aa0 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
14ab0 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
14ac0 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
14ad0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
14ae0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
14af0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
14b00 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
14b10 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
14b20 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
14b30 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14b40 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
14b50 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
14b60 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
14b70 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
14b80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
14b90 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
14ba0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
14bb0 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
14bc0 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
14bd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
14be0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
14bf0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
14c00 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
14c10 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
14c20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
14c30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
14c40 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
14c50 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
14c60 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
14c70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
14c80 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
14c90 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
14ca0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14cc0 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
14cd0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
14ce0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
14cf0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
14d00 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
14d10 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
14d20 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
14d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
14d40 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
14d50 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
14d60 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
14d90 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
14da0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
14db0 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
14dc0 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
14dd0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
14de0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
14df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14e10 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
14e20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
14e30 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e50 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
14e60 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
14e70 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
14e80 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
14e90 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
14ea0 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
14eb0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
14ec0 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
14ed0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
14ee0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
14ef0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
14f00 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
14f10 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
14f20 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
14f30 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
14f40 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
14f50 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
14f60 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
14f70 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
14f80 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
14f90 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
14fa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
14fb0 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
14fc0 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
14fd0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
14fe0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
14ff0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
15000 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
15010 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
15040 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
15050 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
15080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
15090 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
150a0 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
150b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
150c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
150d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
150e0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
150f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
15100 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
15110 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
15120 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
15130 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
15140 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
15150 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
15160 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
15170 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
15180 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
15190 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
151a0 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
151b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
151c0 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
151d0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
151e0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
151f0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
15200 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
15210 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
15220 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
15230 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
15240 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
15250 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
15260 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
15270 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
15280 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
15290 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
152a0 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
152b0 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
152c0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
152d0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
152e0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
152f0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
15300 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
15310 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
15320 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
15330 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15340 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
15350 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
15360 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
15370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15380 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15390 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
153a0 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
153b0 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
153c0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
153d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
153e0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
153f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15400 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
15410 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
15420 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
15430 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
15440 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
15450 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
15460 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
15470 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
15480 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
15490 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
154a0 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
154b0 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
154c0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
154d0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
154e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
154f0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
15500 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
15510 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
15520 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
15530 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
15540 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
15550 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
15560 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
15570 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
15580 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
15590 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
155a0 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
155b0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
155c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
155d0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
155e0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
155f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
15600 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
15610 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15620 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
15630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15640 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
15650 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
15660 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
15670 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
15680 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
15690 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
156a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
156b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
156c0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
156d0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
15710 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
15720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
15740 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
15750 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
15760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15770 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
15780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
157a0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
157b0 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
157c0 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
157d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
157e0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
157f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15800 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
15810 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
15820 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
15830 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15840 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
15850 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
15860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15870 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
15880 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
15890 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
158a0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
158b0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
158c0 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
158d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
158e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
158f0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
15900 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
15910 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
15920 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
15930 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
15940 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15950 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
15960 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
15970 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
15980 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
15990 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
159a0 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
159b0 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
159c0 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
159d0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
159e0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
159f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
15a00 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
15a10 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
15a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a40 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
15a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
15a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a70 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15a90 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
15aa0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
15ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15ac0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
15ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15ae0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
15af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15b10 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
15b20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
15b30 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
15b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15b60 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15b70 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
15b80 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
15b90 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
15ba0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
15bb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
15bc0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
15bd0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
15be0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
15bf0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
15c00 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
15c10 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
15c20 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
15c30 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
15c40 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
15c50 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
15c60 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
15c70 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
15c80 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
15c90 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
15ca0 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
15cb0 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
15cc0 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
15cd0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
15ce0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
15cf0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
15d00 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
15d10 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
15d20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
15d30 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
15d40 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
15d50 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
15d60 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
15d70 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
15d80 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
15d90 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
15da0 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
15db0 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
15dc0 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
15dd0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
15de0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15df0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
15e00 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
15e10 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
15e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15e30 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
15e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15e50 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
15e60 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15e70 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
15e80 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
15e90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
15ea0 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
15eb0 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
15ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15ed0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15ee0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
15ef0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
15f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15f10 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
15f20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
15f30 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
15f60 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
15f70 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
15f80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15fa0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
15fb0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
15fc0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
15fd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15fe0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
15ff0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
16000 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
16010 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
16020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16040 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
16050 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
16060 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
16070 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
16080 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
16090 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
160a0 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
160b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
160c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
160d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
160e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
160f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
16100 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
16110 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
16120 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
16130 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
16140 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
16150 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16160 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
16170 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16180 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
16190 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
161a0 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
161b0 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
161c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
161d0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
161e0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
161f0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
16200 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
16210 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16220 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
16230 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
16240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
16250 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
16260 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
16270 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
16280 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
16290 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
162a0 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
162b0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
162c0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
162d0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
162e0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
162f0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
16300 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
16310 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
16320 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
16330 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
16340 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
16350 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
16360 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
16370 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
16380 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
16390 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
163a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
163b0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
163c0 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
163d0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
163e0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
163f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
16400 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
16410 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
16420 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
16430 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
16440 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
16450 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
16460 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
16470 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
16480 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
16490 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
164a0 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
164b0 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
164c0 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
164d0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
164e0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
164f0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
16500 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
16510 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
16520 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
16530 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
16540 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
16550 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
16560 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
16570 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
16580 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
16590 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
165a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
165b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
165c0 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
165d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
165e0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
165f0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
16600 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
16610 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
16620 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
16630 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
16640 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
16650 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
16660 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
16670 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
16680 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
16690 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
166a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
166b0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
166c0 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
166d0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
166e0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
166f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16700 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
16710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16720 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
16730 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
16740 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
16750 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
16760 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
16770 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
16780 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
16790 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
167a0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
167b0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
167c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
167d0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
167e0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
167f0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
16800 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
16810 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
16820 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
16830 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
16840 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
16850 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
16860 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
16870 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
16880 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
16890 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
168a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
168b0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
168c0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
168d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
168e0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
168f0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
16900 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
16910 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
16920 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
16930 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
16940 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
16950 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
16960 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
16970 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
16980 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
16990 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
169a0 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
169b0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
169c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
169d0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
169e0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
169f0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
16a00 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
16a10 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
16a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
16a30 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
16a40 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
16a50 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
16a60 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
16a70 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
16a80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16a90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
16aa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
16ab0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
16ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16ad0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16ae0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
16af0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
16b00 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
16b10 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
16b20 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
16b30 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
16b40 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
16b50 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
16b60 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
16b70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16b80 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
16b90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
16ba0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
16bb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
16bc0 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
16bd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16be0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
16bf0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
16c00 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
16c10 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
16c20 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
16c30 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
16c40 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
16c50 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
16c60 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
16c70 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
16c80 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
16c90 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
16ca0 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
16cb0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
16cc0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
16cd0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
16ce0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
16cf0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
16d00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
16d10 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
16d20 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
16d30 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
16d40 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
16d50 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
16d60 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
16d70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
16d80 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
16d90 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
16da0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16db0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
16dc0 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
16dd0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
16de0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
16df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16e00 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
16e10 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
16e20 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
16e30 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
16e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
16e50 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
16e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16e70 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
16e80 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
16e90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
16ea0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
16eb0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
16ec0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16ed0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16ee0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
16ef0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
16f00 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
16f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
16f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16f30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
16f40 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
16f50 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
16f60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
16f80 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
16f90 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
16fa0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
16fb0 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
16fc0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
16fd0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
16fe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16ff0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
17000 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
17010 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
17020 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
17030 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
17040 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
17050 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
17060 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
17070 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
17080 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
17090 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
170a0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
170b0 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
170c0 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
170d0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
170e0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
170f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
17100 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
17110 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
17120 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
17130 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
17140 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
17150 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
17160 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
17170 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
17180 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
17190 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
171a0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
171b0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
171c0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
171d0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
171e0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
171f0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
17200 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
17210 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
17220 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17230 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
17240 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
17250 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
17260 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
17270 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
17280 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
17290 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
172a0 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
172b0 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
172c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
172d0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
172e0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
172f0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
17300 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
17310 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
17320 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
17330 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
17340 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
17350 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
17360 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
17370 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
17380 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
17390 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
173a0 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
173b0 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
173c0 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
173d0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
173e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
173f0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
17400 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
17410 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
17420 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
17430 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
17440 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
17450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17460 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
17470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
17480 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
17490 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
174a0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
174b0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
174c0 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
174d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
174e0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
174f0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
17500 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
17510 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
17520 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
17530 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
17540 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
17550 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
17560 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
17570 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
17580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17590 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
175a0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
175b0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
175c0 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
175d0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
175e0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
175f0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
17600 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
17610 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17620 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
17630 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
17640 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
17650 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
17660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
17670 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
17680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17690 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
176a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
176b0 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
176c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
176d0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
176e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
176f0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
17700 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
17710 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
17720 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
17730 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
17740 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
17750 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
17760 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
17770 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
17780 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
17790 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
177a0 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
177b0 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
177c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
177d0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
177e0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
177f0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
17800 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
17810 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
17820 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
17830 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
17840 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
17850 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
17860 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
17870 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
17880 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
17890 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
178a0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
178b0 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
178c0 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
178d0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
178e0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
178f0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
17900 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
17910 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
17920 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
17930 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
17940 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
17950 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
17960 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
17970 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
17980 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
17990 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
179a0 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
179b0 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
179c0 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
179d0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
179e0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
179f0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
17a00 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
17a10 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
17a20 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
17a30 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
17a40 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
17a50 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
17a60 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
17a70 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
17a80 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
17a90 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
17aa0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
17ab0 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
17ac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17ad0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
17ae0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
17af0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
17b00 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
17b10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
17b20 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
17b30 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
17b40 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
17b50 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
17b60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
17b70 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
17b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17b90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
17ba0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
17bb0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
17bc0 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
17bd0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
17be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
17bf0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
17c00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
17c10 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
17c20 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
17c30 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
17c40 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
17c50 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
17c60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
17c70 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
17c80 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
17c90 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
17ca0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
17cb0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
17cc0 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
17cd0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
17ce0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
17cf0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
17d00 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
17d10 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
17d20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17d30 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
17d40 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
17d50 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
17d60 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
17d70 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
17d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17d90 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17da0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17db0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
17dc0 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
17dd0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
17de0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
17df0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
17e00 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
17e10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
17e20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
17e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17e40 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
17e50 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
17e60 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
17e70 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
17e80 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
17e90 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
17ea0 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
17eb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
17ec0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
17ed0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
17ee0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
17ef0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
17f00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
17f10 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
17f20 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
17f30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17f40 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
17f50 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
17f60 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
17f70 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
17f80 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
17f90 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
17fa0 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
17fb0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
17fc0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
17fd0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
17fe0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
17ff0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
18000 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
18010 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
18020 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
18030 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
18040 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
18050 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
18060 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
18070 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
18080 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
18090 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
180a0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
180b0 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
180c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
180d0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
180e0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
180f0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
18100 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
18110 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
18120 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
18130 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
18140 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
18150 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
18160 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
18170 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
18180 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
18190 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
181a0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
181b0 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
181c0 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
181d0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
181e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
181f0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
18200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
18210 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
18220 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
18230 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
18240 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
18250 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
18260 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
18270 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
18280 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
18290 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
182a0 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
182b0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
182c0 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
182d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
182e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
182f0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
18300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18310 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
18320 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
18330 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
18340 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
18350 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
18360 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
18370 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
18380 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
18390 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
183a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
183b0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
183c0 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
183d0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
183e0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
183f0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
18400 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
18410 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
18420 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
18430 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
18440 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
18450 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18460 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
18470 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18480 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
18490 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
184a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
184b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
184c0 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
184d0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
184e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
184f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18510 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
18520 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
18530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18540 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
18550 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
18560 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
18570 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
18580 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
18590 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
185a0 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
185b0 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
185c0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
185d0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
185e0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
185f0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
18600 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
18610 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
18620 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
18630 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
18640 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
18650 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
18660 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
18670 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
18680 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
18690 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
186a0 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
186b0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
186c0 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
186d0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
186e0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
186f0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
18700 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18710 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
18720 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
18730 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18740 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
18750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18760 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
18770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
18780 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
18790 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
187a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
187b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
187c0 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
187d0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
187e0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
187f0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
18800 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
18810 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
18820 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
18830 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
18840 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18850 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
18860 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
18870 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
18880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18890 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
188a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
188b0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
188c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
188d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
188e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
188f0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
18900 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
18910 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18920 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18930 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
18950 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
18960 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
18970 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
18980 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
18990 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
189a0 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
189b0 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
189c0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
189d0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
189e0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
189f0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
18a00 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
18a10 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
18a20 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
18a30 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
18a40 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
18a50 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
18a60 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
18a70 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
18a80 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
18a90 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
18aa0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
18ab0 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
18ac0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
18ad0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
18ae0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
18af0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
18b00 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
18b10 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
18b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b30 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
18b40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18b50 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
18b60 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
18b70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
18b80 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
18b90 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
18ba0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
18bb0 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
18bc0 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
18bd0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
18be0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18bf0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
18c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18c10 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
18c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18c30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
18c40 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
18c50 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
18c60 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
18c70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18c80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18c90 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
18ca0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
18cb0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
18cc0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
18cd0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
18ce0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
18cf0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
18d00 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
18d10 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
18d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
18d30 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
18d40 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
18d50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
18d60 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
18d70 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
18d80 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
18d90 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
18da0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
18db0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
18dc0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
18dd0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
18de0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
18df0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
18e00 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
18e10 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
18e20 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
18e30 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
18e40 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
18e50 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
18e60 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
18e70 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
18e80 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
18e90 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
18ea0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
18eb0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
18ec0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
18ed0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
18ee0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
18ef0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
18f00 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
18f10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
18f20 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
18f30 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
18f40 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
18f50 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
18f60 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
18f70 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
18f80 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
18f90 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
18fa0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
18fb0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
18fc0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
18fd0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
18fe0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18ff0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
19000 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
19010 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
19020 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
19030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19050 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
19060 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
19070 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
19080 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
19090 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
190a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
190b0 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
190c0 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
190d0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
190e0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
190f0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
19100 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
19110 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
19120 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
19130 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19140 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
19150 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19160 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
19170 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
19180 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
19190 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
191a0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
191b0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
191c0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
191d0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
191e0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
191f0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
19200 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
19210 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
19220 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
19230 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
19240 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
19250 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
19260 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
19270 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
19280 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
19290 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
192a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
192b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
192c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
192d0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
192e0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
192f0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
19300 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19310 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
19320 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
19330 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
19340 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
19360 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
19370 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19390 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
193a0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
193b0 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
193c0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
193d0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
193e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
193f0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
19400 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19410 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
19420 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
19430 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
19440 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
19450 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
19460 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
19470 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
19480 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
19490 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
194a0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
194b0 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
194c0 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
194d0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
194e0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
194f0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
19500 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
19510 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
19520 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
19530 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
19540 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
19550 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
19560 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
19570 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
19580 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
19590 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
195a0 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
195b0 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
195c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
195d0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
195e0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
195f0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
19600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19610 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
19620 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
19630 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
19640 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19650 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
19660 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
19670 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
19680 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
19690 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
196a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
196b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
196c0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
196d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
196e0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
196f0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
19700 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
19710 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
19720 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
19730 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
19740 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
19750 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
19760 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
19770 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
19780 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
19790 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
197a0 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
197b0 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
197c0 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
197d0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
197e0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
197f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19800 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
19810 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
19820 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
19830 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19840 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
19850 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
19860 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
19870 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19880 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
19890 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
198a0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
198b0 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
198c0 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
198d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
198e0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
198f0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
19900 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
19910 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
19920 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
19930 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
19940 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
19950 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
19960 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
19970 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
19980 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
19990 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
199a0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
199b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
199c0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
199d0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
199e0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
199f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19a00 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
19a10 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
19a20 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
19a30 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
19a40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19a50 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
19a60 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
19a70 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
19a80 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
19a90 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
19aa0 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
19ab0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
19ac0 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
19ad0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
19ae0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
19af0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
19b00 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
19b10 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
19b20 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
19b30 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
19b40 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
19b50 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
19b60 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
19b70 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
19b80 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
19b90 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
19ba0 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
19bb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19bc0 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
19bd0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
19be0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
19bf0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
19c00 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
19c10 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
19c20 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
19c30 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
19c40 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
19c50 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
19c60 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
19c70 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
19c80 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
19c90 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
19ca0 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
19cb0 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
19cc0 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
19cd0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
19ce0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
19cf0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
19d00 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
19d10 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
19d20 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
19d30 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
19d40 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
19d50 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
19d60 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
19d70 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
19d80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19d90 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
19da0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
19db0 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
19dc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
19dd0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
19de0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19df0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
19e00 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
19e10 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
19e20 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
19e30 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
19e40 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
19e50 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
19e60 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
19e70 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
19e80 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
19e90 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
19ea0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
19eb0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
19ec0 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
19ed0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
19ee0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19ef0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
19f00 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
19f10 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
19f20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19f30 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
19f40 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
19f50 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
19f60 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
19f70 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
19f80 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
19f90 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
19fa0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
19fb0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
19fc0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
19fd0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
19fe0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
19ff0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
1a000 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
1a010 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
1a020 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
1a030 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
1a040 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
1a050 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
1a060 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
1a070 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
1a080 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
1a090 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a0a0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
1a0b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
1a0c0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
1a0d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1a0e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a0f0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
1a100 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
1a110 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a120 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
1a130 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1a140 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
1a150 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
1a160 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
1a170 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1a180 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1a190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
1a1a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
1a1b0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
1a1c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
1a1d0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
1a1e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a1f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a200 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
1a210 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
1a220 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
1a230 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
1a240 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
1a250 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
1a260 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
1a270 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
1a280 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
1a290 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
1a2a0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
1a2b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a2c0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
1a2d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
1a2e0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
1a2f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a300 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a310 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
1a320 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1a330 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
1a340 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
1a350 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
1a360 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
1a370 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
1a380 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
1a390 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
1a3a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
1a3c0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
1a3d0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
1a3e0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
1a3f0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
1a400 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a410 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
1a420 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
1a430 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
1a440 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
1a450 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
1a460 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
1a470 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1a480 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
1a490 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
1a4a0 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
1a4b0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
1a4c0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
1a4d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
1a4e0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
1a4f0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
1a500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
1a510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1a520 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
1a530 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
1a540 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
1a550 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1a560 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
1a570 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
1a580 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
1a590 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
1a5a0 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
1a5b0 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
1a5c0 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
1a5d0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
1a5e0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
1a5f0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
1a600 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
1a610 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
1a620 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
1a630 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
1a640 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
1a650 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
1a660 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
1a670 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
1a680 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
1a690 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
1a6a0 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
1a6b0 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
1a6c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
1a6d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1a6e0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1a6f0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
1a700 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
1a710 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1a720 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1a730 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1a740 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
1a750 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
1a760 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
1a770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a780 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
1a790 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
1a7a0 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
1a7b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
1a7c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1a7d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
1a7e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1a7f0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
1a800 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
1a810 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
1a820 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
1a830 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
1a840 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1a850 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1a860 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
1a870 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
1a880 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
1a890 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
1a8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
1a8b0 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
1a8c0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a8e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
1a8f0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
1a900 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
1a910 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
1a920 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
1a930 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1a940 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1a950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1a960 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1a970 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
1a980 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
1a990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1a9a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1a9b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1a9c0 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
1a9d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1a9e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1a9f0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
1aa00 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
1aa10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1aa20 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1aa30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1aa40 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
1aa50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1aa60 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1aa70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
1aa80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1aaa0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1aab0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1aac0 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
1aad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1aae0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
1aaf0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
1ab00 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
1ab10 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
1ab20 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
1ab30 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
1ab40 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
1ab50 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
1ab60 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
1ab70 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1ab80 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
1ab90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1aba0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1abb0 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
1abc0 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
1abd0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
1abe0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
1abf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
1ac00 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
1ac10 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
1ac20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
1ac30 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1ac40 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
1ac50 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
1ac60 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
1ac70 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
1ac80 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
1ac90 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
1aca0 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
1acb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
1acc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1acd0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
1ace0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
1acf0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
1ad00 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
1ad10 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
1ad20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
1ad30 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
1ad40 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
1ad50 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
1ad60 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
1ad70 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
1ad80 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
1ad90 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
1ada0 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
1adb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
1adc0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1add0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
1ade0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1adf0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
1ae00 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
1ae10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1ae20 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
1ae30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
1ae40 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
1ae50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1ae60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1ae70 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
1ae80 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
1ae90 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1aea0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1aeb0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1aec0 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
1aed0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1aee0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1aef0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1af00 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
1af10 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
1af20 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
1af30 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
1af40 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
1af50 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
1af60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1af70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
1af80 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
1af90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
1afa0 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
1afb0 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
1afc0 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
1afd0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
1afe0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
1aff0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
1b000 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
1b010 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
1b020 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
1b030 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
1b040 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
1b050 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
1b060 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
1b070 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
1b080 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
1b090 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
1b0a0 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
1b0b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b0c0 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
1b0d0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1b0e0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
1b0f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1b100 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
1b110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b120 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
1b130 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
1b140 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b160 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1b170 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1b180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b190 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1b1a0 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1b1b0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
1b1c0 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
1b1d0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
1b1e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1b1f0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1b200 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
1b210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b220 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1b230 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b240 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
1b250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b260 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
1b270 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
1b280 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
1b290 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
1b2a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
1b2b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
1b2c0 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
1b2d0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
1b2e0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
1b2f0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
1b300 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
1b310 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
1b320 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
1b330 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
1b340 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1b350 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
1b360 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
1b370 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
1b380 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
1b390 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
1b3a0 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
1b3b0 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
1b3c0 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
1b3d0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
1b3e0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
1b3f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1b400 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1b410 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1b420 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1b430 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
1b440 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
1b450 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1b460 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
1b470 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
1b480 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
1b490 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1b4a0 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
1b4b0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
1b4c0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
1b4d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1b4e0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
1b4f0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
1b500 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
1b510 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b520 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
1b530 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
1b540 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
1b550 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
1b560 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
1b570 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
1b580 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
1b590 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
1b5a0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
1b5b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
1b5c0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
1b5d0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
1b5e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
1b5f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1b600 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1b610 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
1b620 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
1b630 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1b640 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
1b650 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
1b660 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
1b670 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
1b680 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
1b690 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
1b6a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1b6b0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
1b6c0 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
1b6d0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
1b6e0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
1b6f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
1b700 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
1b710 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
1b720 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
1b730 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
1b740 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1b750 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
1b760 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
1b770 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
1b780 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
1b790 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b7a0 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
1b7b0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
1b7c0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
1b7d0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
1b7e0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
1b7f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1b800 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
1b810 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
1b820 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1b830 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1b840 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1b850 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1b860 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1b870 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1b880 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1b890 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1b8a0 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1b8b0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1b8c0 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1b8d0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1b8e0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1b8f0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1b900 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1b910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1b920 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1b930 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1b940 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1b950 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1b960 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1b970 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1b980 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1b990 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1b9a0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1b9b0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1b9c0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1b9d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b9e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1b9f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1ba00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1ba40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1ba50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ba60 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
1ba70 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
1ba80 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26  riteSchema)==0 &
1ba90 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
1baa0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1bab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bac0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1bad0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1bae0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1baf0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1bb00 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
1bb10 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
1bb20 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
1bb30 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
1bb40 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
1bb50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1bb60 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1bb70 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
1bb80 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
1bb90 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
1bba0 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
1bbb0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
1bbc0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
1bbd0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1bbe0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1bbf0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1bc00 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1bc10 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc20 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
1bc30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bc40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bc50 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
1bc60 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1bc70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
1bc80 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
1bc90 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
1bca0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1bcb0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
1bcc0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
1bcd0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
1bce0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
1bcf0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
1bd00 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
1bd10 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
1bd20 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
1bd30 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
1bd40 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
1bd50 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
1bd60 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
1bd70 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
1bd80 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
1bd90 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
1bda0 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
1bdb0 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
1bdc0 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
1bdd0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
1bde0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
1bdf0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
1be00 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
1be10 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
1be20 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1be30 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
1be40 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1be50 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
1be60 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
1be70 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
1be80 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
1be90 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
1bea0 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
1beb0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
1bec0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
1bed0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
1bee0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
1bef0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
1bf00 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
1bf10 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
1bf20 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
1bf30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1bf40 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
1bf50 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
1bf60 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1bf70 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1bf80 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1bf90 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
1bfa0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
1bfb0 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
1bfc0 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
1bfd0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1bfe0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1bff0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
1c000 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
1c010 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1c020 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
1c030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
1c040 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1c050 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
1c060 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
1c070 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
1c080 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
1c090 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
1c0a0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1c0b0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
1c0c0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1c0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c0e0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
1c0f0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
1c100 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1c110 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1c120 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1c130 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1c140 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
1c150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
1c160 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
1c170 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1c180 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1c190 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1c1a0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1c1b0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1c1c0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1c1d0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
1c1e0 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
1c1f0 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
1c200 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
1c210 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
1c220 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
1c230 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
1c240 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1c250 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1c260 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
1c270 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1c280 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1c290 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
1c2a0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1c2b0 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
1c2c0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
1c2d0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
1c2e0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
1c2f0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
1c300 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
1c310 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
1c320 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
1c330 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
1c340 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
1c350 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1c360 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1c370 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1c380 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1c390 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
1c3a0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
1c3b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
1c3c0 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
1c3d0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
1c3e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1c3f0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1c400 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1c410 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1c420 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1c430 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
1c440 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
1c450 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
1c460 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1c470 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
1c480 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1c490 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
1c4a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1c4b0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
1c4c0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1c4d0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
1c4e0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
1c4f0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
1c500 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1c510 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1c520 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1c530 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
1c540 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c550 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c560 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
1c570 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
1c580 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
1c590 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c5a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c5b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1c5c0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1c5d0 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
1c5e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c5f0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1c600 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
1c610 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1c620 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
1c630 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
1c640 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1c650 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
1c660 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
1c670 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
1c680 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1c690 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
1c6a0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
1c6b0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
1c6c0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1c6d0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1c6e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1c6f0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1c700 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1c710 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1c720 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1c730 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1c740 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1c750 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1c760 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1c770 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1c780 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1c790 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1c7a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1c7b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1c7c0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1c7d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1c7e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c7f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c800 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1c810 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c830 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1c840 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1c850 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1c860 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1c870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c880 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1c890 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1c8a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1c8b0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1c8c0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1c8d0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1c8e0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1c8f0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1c900 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1c910 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1c920 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1c930 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1c940 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1c950 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1c960 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1c970 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1c980 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1c990 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1c9a0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1c9b0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1c9c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1c9d0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1c9e0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1c9f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1ca00 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1ca10 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1ca20 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1ca30 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1ca40 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1ca50 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1ca60 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1ca70 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1ca80 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1ca90 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1caa0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1cab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cac0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1cad0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1cae0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1caf0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1cb00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cb10 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1cb20 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1cb30 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1cb40 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1cb50 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1cb60 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1cb70 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1cb80 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1cb90 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1cba0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1cbb0 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1cbc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cbd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1cbe0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1cbf0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1cc00 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1cc10 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1cc20 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1cc30 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1cc40 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1cc50 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1cc60 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1cc70 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1cc80 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1cc90 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1cca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ccb0 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1ccc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1ccd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1cce0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1ccf0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1cd00 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1cd10 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1cd20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1cd30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cd40 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1cd50 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1cd60 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1cd80 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1cd90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cda0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1cdb0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1cdc0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1cdd0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1cde0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1cdf0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1ce00 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1ce10 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1ce20 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1ce30 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1ce40 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1ce50 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1ce60 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1ce70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1ce80 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1ce90 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1cea0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1ceb0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1cec0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1ced0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1cee0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1cef0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1cf00 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1cf10 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1cf20 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1cf30 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1cf40 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1cf50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1cf60 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1cf70 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1cf80 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1cf90 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1cfa0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1cfb0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1cfc0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1cfd0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1cfe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1cff0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1d000 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1d010 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1d020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d030 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1d040 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d050 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1d060 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1d070 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1d080 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1d090 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1d0a0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1d0b0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1d0c0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1d0d0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1d0e0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1d0f0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1d100 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1d110 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1d120 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1d130 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1d140 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1d150 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1d160 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1d170 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1d180 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1d190 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1d1a0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1d1b0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1d1c0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1d1d0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1d1e0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1d1f0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1d200 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1d210 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1d220 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1d230 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1d240 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1d250 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1d260 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1d270 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1d280 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1d290 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1d2a0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1d2b0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1d2c0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1d2d0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1d2e0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1d2f0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1d300 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1d310 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1d320 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1d330 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1d340 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1d350 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1d360 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1d370 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1d380 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1d390 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1d3a0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1d3b0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1d3c0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1d3d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1d3e0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1d3f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1d400 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68  rflag, int *pSch
1d410 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42  emaVersion){.  B
1d420 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d430 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1d440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d450 6e 74 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d  nt bConcurrent =
1d460 20 28 70 2d 3e 64 62 2d 3e 62 43 6f 6e 63 75 72   (p->db->bConcur
1d470 72 65 6e 74 20 26 26 20 21 49 53 41 55 54 4f 56  rent && !ISAUTOV
1d480 41 43 55 55 4d 29 3b 0a 0a 20 20 73 71 6c 69 74  ACUUM);..  sqlit
1d490 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1d4a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1d4b0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1d4c0 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1d4d0 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1d4e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1d4f0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1d500 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1d510 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1d520 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1d530 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1d540 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1d550 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1d560 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d570 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1d580 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1d590 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1d5a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1d5b0 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1d5c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1d5d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1d5e0 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1d5f0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1d600 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1d610 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1d620 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1d630 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1d640 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1d650 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1d660 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1d670 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1d680 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1d690 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1d6a0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1d6b0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1d6c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1d6d0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a  HARED_CACHE.  {.
1d6e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c      sqlite3 *pBl
1d6f0 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  ock = 0;.    /* 
1d700 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
1d710 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
1d720 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
1d730 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1d740 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69  n .    ** on thi
1d750 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
1d760 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
1d770 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
1d780 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a  saction is.    *
1d790 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
1d7a0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1d7b0 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  D..    */.    if
1d7c0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1d7d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1d7e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1d7f0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
1d800 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
1d810 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  NG)!=0.    ){.  
1d820 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
1d830 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
1d840 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66     }else if( wrf
1d850 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42  lag>1 ){.      B
1d860 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
1d870 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1d880 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1d890 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1d8a0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1d8b0 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1d8c0 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =p ){.          
1d8d0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1d8e0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1d8f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d910 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c     }.    if( pBl
1d920 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ock ){.      sql
1d930 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1d940 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
1d950 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
1d960 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1d970 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
1d980 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1d990 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  un;.    }.  }.#e
1d9a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
1d9b0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
1d9c0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
1d9d0 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
1d9e0 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
1d9f0 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
1da00 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
1da10 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
1da20 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
1da30 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
1da40 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
1da50 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
1da60 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
1da70 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
1da80 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1da90 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
1daa0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
1dab0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
1dac0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1dad0 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
1dae0 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
1daf0 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
1db00 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
1db10 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1db20 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
1db30 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
1db40 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
1db50 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
1db60 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
1db70 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
1db80 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
1db90 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1dba0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1dbb0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
1dbc0 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
1dbd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dbe0 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
1dbf0 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
1dc00 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
1dc10 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
1dc20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
1dc30 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1dc40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1dc50 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
1dc60 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
1dc70 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1dc80 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
1dc90 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
1dca0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
1dcb0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1dcc0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1dcd0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
1dce0 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
1dcf0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
1dd00 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
1dd10 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
1dd20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dd30 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1dd40 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
1dd50 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1dd60 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
1dd70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1dd80 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1dd90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dda0 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20 62    int exFlag = b
1ddb0 43 6f 6e 63 75 72 72 65 6e 74 20 3f 20 2d 31 20  Concurrent ? -1 
1ddc0 3a 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  : (wrflag>1);.  
1ddd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dde0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1ddf0 2d 3e 70 50 61 67 65 72 2c 20 65 78 46 6c 61 67  ->pPager, exFlag
1de00 2c 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  , sqlite3TempInM
1de10 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1de20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1de30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de40 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1de50 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1de60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1de70 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  c==SQLITE_BUSY_S
1de80 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e  NAPSHOT && pBt->
1de90 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1dea0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1deb0 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
1dec0 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61  re was no transa
1ded0 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65  ction opened whe
1dee0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1def0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1df00 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49   called and SQLI
1df10 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1df20 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68   is returned, ch
1df30 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20  ange the error. 
1df40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1df50 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   to SQLITE_BUSY.
1df60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1df70 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1df80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df90 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1dfa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dfb0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1dfc0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1dfd0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1dfe0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1dff0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1e000 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1e010 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1e020 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1e030 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1e040 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  (pBt) );.  sqlit
1e050 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
1e060 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61  Timeout(pBt->pPa
1e070 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ger);..  if( rc=
1e080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e090 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1e0a0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1e0b0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1e0c0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1e0d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1e0e0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1e0f0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1e100 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1e110 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1e120 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1e130 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1e140 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1e150 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1e160 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1e170 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1e180 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1e190 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1e1a0 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1e1b0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1e1c0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1e1d0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1e1e0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1e1f0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1e200 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1e210 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1e220 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1e230 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1e240 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1e250 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1e260 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1e270 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1e280 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1e290 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1e2a0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1e2b0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1e2c0 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1e2d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1e2e0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1e2f0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1e300 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1e310 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1e320 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1e330 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1e340 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1e350 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1e360 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1e370 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1e380 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1e390 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1e3a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e3b0 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1e3c0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1e3d0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1e3e0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1e3f0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1e400 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1e410 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1e420 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1e430 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1e440 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1e450 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1e460 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1e470 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1e480 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e490 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e4a0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1e4b0 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1e4c0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1e4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e4e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e4f0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e520 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e530 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e540 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1e550 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e570 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 23 69 66  trans_begun:.#if
1e580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e590 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66  _CONCURRENT.  if
1e5a0 28 20 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26  ( bConcurrent &&
1e5b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e5c0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  & sqlite3PagerIs
1e5d0 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Wal(pBt->pPager)
1e5e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e5f0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 43 6f  ite3PagerBeginCo
1e600 6e 63 75 72 72 65 6e 74 28 70 42 74 2d 3e 70 50  ncurrent(pBt->pP
1e610 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1e620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e630 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1e640 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61 70  rc = btreePtrmap
1e650 41 6c 6c 6f 63 61 74 65 28 70 42 74 29 3b 0a 20  Allocate(pBt);. 
1e660 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1e670 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1e690 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29  pSchemaVersion )
1e6a0 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61  {.      *pSchema
1e6b0 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79  Version = get4by
1e6c0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e6d0 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20  >aData[40]);.   
1e6e0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1e6f0 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  g ){.      /* Th
1e700 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1e710 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1e720 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1e730 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1e740 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1e750 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1e760 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1e770 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1e780 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
1e790 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1e7a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1e7b0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1e7c0 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1e7d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
1e7e0 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t nSavepoint = p
1e7f0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1e800 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1e810 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1e820 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1e830 65 72 2c 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b  er, nSavepoint);
1e840 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e850 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 53 61 76  QLITE_OK && nSav
1e860 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
1e870 20 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d    rc = btreePtrm
1e880 61 70 42 65 67 69 6e 28 70 42 74 2c 20 6e 53 61  apBegin(pBt, nSa
1e890 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
1e8a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  }.    }.  }..  b
1e8b0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1e8c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e8d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e8e0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1e8f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e900 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1e910 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1e920 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1e930 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1e940 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1e950 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1e960 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1e970 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1e980 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1e990 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1e9a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1e9b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1e9c0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1e9d0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1e9e0 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1e9f0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1ea00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea20 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1ea30 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1ea40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ea60 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1ea70 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1ea80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1eab0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1eac0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1ead0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1eae0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1eaf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1eb00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1eb10 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1eb20 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e  ;.  rc = pPage->
1eb30 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f  isInit ? SQLITE_
1eb40 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61  OK : btreeInitPa
1eb50 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1eb60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43   return rc;.  nC
1eb80 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1eb90 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1eba0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1ebb0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1ebc0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1ebd0 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1ebe0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1ebf0 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
1ec00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1ec10 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
1ec20 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1ec30 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
1ec40 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1ec50 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1ec60 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1ec70 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1ec80 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
1ec90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1eca0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1ecb0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1ecc0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1ecd0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
1ece0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1ecf0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1ed00 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1ed10 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1ed20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
1ed30 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
1ed40 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1ed50 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
1ed60 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
1ed70 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
1ed80 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
1ed90 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
1eda0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
1edb0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
1edc0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
1edd0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
1ede0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
1edf0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
1ee00 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1ee10 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1ee20 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
1ee50 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1ee60 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
1ee70 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1ee80 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ee90 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
1eea0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1eeb0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
1eec0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
1eed0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
1eee0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1eef0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
1ef00 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
1ef10 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1ef20 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
1ef30 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
1ef40 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
1ef50 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1ef60 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1ef70 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
1ef80 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
1ef90 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
1efa0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
1efb0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
1efc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1efd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1efe0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1eff0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
1f000 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
1f010 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
1f020 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1f030 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
1f040 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
1f050 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
1f060 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
1f070 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
1f080 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
1f090 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
1f0a0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
1f0b0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
1f0c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f0d0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
1f0e0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1f0f0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1f100 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1f110 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1f120 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1f130 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50  rc;..    rc = pP
1f140 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1f150 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1f160 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1f170 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1f180 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1f190 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1f1a0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1f1b0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1f1c0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1f1d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1f1e0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1f1f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1f200 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1f210 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1f220 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1f230 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1f240 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1f250 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1f260 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
1f270 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
1f280 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e      if( pCell+in
1f290 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65  fo.nSize > pPage
1f2a0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70  ->aData+pPage->p
1f2b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1f2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1f2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f2e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1f2f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f300 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
1f310 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ==get4byte(pCell
1f320 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29  +info.nSize-4) )
1f330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1f340 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1f350 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b  o.nSize-4, iTo);
1f360 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1f370 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1f380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1f3a0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
1f3b0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
1f3c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f3d0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
1f3e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1f3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f400 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1f410 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
1f420 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
1f430 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
1f440 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
1f450 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1f460 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1f470 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
1f480 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1f490 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1f4a0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
1f4b0 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1f4c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1f4d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1f4e0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
1f4f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f500 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1f510 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1f520 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1f530 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1f540 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1f550 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1f560 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1f570 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1f580 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1f590 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1f5a0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1f5b0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1f5c0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1f5d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1f5e0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1f5f0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1f600 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1f610 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1f620 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1f630 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1f640 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1f650 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1f660 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1f670 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1f680 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1f690 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1f6a0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1f6b0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1f6c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1f6d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1f6e0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f700 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1f710 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1f720 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1f730 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1f740 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1f750 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1f760 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1f770 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1f780 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1f790 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1f7a0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1f7b0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1f7d0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1f7e0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1f7f0 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1f800 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1f810 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1f820 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1f830 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1f840 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1f850 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1f860 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1f870 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1f880 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1f890 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1f8a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1f8b0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1f8c0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1f8d0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1f8e0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1f8f0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1f900 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1f910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f920 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1f930 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f940 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1f950 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1f960 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1f970 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1f980 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1f990 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1f9a0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1f9b0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1f9c0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1f9d0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1f9e0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1f9f0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1fa00 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1fa10 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1fa20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fa30 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1fa40 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1fa50 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1fa60 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1fa70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fa80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fa90 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1faa0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1fab0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1fac0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1fad0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1fae0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1faf0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1fb00 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1fb10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1fb20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1fb30 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1fb40 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1fb50 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1fb60 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1fb70 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1fb80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1fb90 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1fba0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1fbb0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1fbc0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1fbd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1fbe0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1fbf0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1fc00 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1fc10 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1fc20 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1fc30 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1fc40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1fc50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1fc60 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1fc70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1fc80 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1fc90 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1fca0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fcb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fcc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fcd0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1fce0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1fcf0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1fd00 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1fd10 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1fd20 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1fd30 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1fd40 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1fd50 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1fd60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fd80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fd90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fda0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1fdb0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1fdc0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1fdd0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1fde0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1fdf0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1fe00 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1fe10 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1fe20 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1fe30 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1fe40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1fe50 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1fe60 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1fe70 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1fe80 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1fe90 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1fea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1feb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1fec0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1fed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fee0 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1fef0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1ff00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff10 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1ff20 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1ff30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ff40 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1ff50 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1ff60 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1ff70 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1ff80 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1ff90 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1ffa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ffb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ffc0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1ffd0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1ffe0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1fff0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
20000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
20010 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
20020 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
20030 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
20040 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
20050 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
20060 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
20070 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
20080 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
20090 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
200a0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
200b0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
200c0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
200d0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
200e0 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
200f0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
20100 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
20110 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
20120 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
20130 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
20140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
20150 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
20160 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
20170 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
20180 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20190 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
201a0 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
201b0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
201c0 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
201d0 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
201e0 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
201f0 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
20200 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
20210 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
20220 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
20230 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
20240 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20250 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
20260 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
20270 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
20280 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
20290 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
202a0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
202b0 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
202c0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
202d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
202e0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
202f0 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
20300 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
20310 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
20320 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
20330 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
20340 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
20350 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
20360 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
20370 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
20380 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
20390 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
203a0 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
203b0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
203c0 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
203d0 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
203e0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
203f0 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
20400 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
20410 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
20420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20430 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
20440 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
20450 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
20460 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20470 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20480 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20490 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
204a0 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
204b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
204c0 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
204d0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
204e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
204f0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
20500 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
20510 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
20520 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
20530 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20540 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
20550 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
20560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20570 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
20580 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
20590 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
205a0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
205b0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
205c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
205d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
205e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
205f0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
20600 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
20610 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20620 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
20630 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
20640 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
20650 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
20660 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
20670 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
20680 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
20690 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
206a0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
206b0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
206c0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
206d0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
206e0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
206f0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
20700 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
20710 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
20720 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
20730 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
20740 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
20750 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
20760 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
20770 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
20780 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
20790 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
207a0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
207b0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
207c0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
207d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
207e0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
207f0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
20800 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
20810 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20820 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20830 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20850 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
20860 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
20870 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20880 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
20890 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
208a0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
208b0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
208c0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
208d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
208e0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
208f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
20900 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
20910 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
20920 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
20930 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
20940 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
20950 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
20960 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
20970 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
20980 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
20990 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
209a0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
209b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
209c0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
209d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
209e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
209f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20a00 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
20a10 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
20a20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
20a30 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
20a40 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
20a50 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
20a60 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
20a70 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
20a80 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
20a90 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
20aa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
20ab0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
20ac0 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
20ad0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
20ae0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
20af0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
20b00 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
20b10 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
20b20 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
20b30 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
20b40 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
20b50 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
20b60 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
20b70 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
20b80 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
20b90 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
20ba0 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
20bb0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
20bc0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
20bd0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
20be0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
20bf0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
20c00 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
20c10 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
20c20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20c40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
20c50 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
20c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
20c80 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
20c90 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
20ca0 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
20cb0 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
20cc0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
20cd0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
20ce0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
20cf0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
20d00 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
20d10 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
20d20 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
20d30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20d40 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
20d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
20d70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
20d90 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
20da0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
20db0 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
20dc0 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
20dd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20de0 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
20df0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
20e00 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
20e10 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
20e20 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
20e30 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
20e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20e50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
20e60 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
20e70 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
20e80 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
20e90 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
20ea0 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
20eb0 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
20ec0 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
20ed0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
20ee0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
20ef0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20f00 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
20f10 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
20f20 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
20f30 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
20f40 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
20f50 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
20f60 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
20f70 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20fa0 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
20fb0 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
20fc0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
20ff0 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
21000 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
21010 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21030 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
21040 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
21050 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
21060 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
21070 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
21080 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
21090 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
210a0 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
210b0 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
210c0 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
210d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
210e0 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
210f0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
21100 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
21110 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
21120 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
21130 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
21140 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
21150 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
21160 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
21170 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
21180 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
21190 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
211a0 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
211b0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
211c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
211d0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
211e0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
211f0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
21200 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
21210 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
21220 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
21230 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
21240 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
21250 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
21260 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
21270 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
21280 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
21290 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
212a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
212b0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
212c0 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
212d0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
212e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
212f0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
21300 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
21310 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21320 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
21330 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
21340 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
21350 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21360 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
21370 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21380 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
21390 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
213a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
213b0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
213c0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
213d0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
213e0 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
213f0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
21400 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
21410 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
21420 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
21430 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
21440 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
21450 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
21460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21470 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21480 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21490 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
214a0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
214b0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
214c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
214d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
214e0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
214f0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
21500 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
21510 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
21520 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
21530 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
21540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21570 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
21580 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
21590 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
215a0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
215b0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
215c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
215d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
215e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
215f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
21600 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21610 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
21620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21630 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21640 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
21650 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
21660 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
21670 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
21680 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
21690 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
216a0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
216b0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
216c0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
216d0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
216e0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
216f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
21700 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
21710 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
21720 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
21730 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
21740 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
21750 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
21760 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
21770 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
21780 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
21790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
217a0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
217b0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
217c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
217d0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
217e0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
217f0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
21800 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
21810 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
21820 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
21830 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21840 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
21850 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
21860 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
21870 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
21880 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
21890 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
218a0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
218b0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
218c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
218d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
218e0 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
218f0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
21900 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
21910 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21920 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
21930 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
21940 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
21950 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
21960 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
21970 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
21980 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
21990 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
219a0 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
219b0 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
219c0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
219d0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
219e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
219f0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
21a00 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
21a10 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
21a20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
21a30 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
21a40 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
21a50 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
21a60 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
21a70 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
21a80 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
21a90 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
21aa0 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
21ab0 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
21ac0 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
21ad0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
21ae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21b00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21b10 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
21b20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
21b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
21b40 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
21b50 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
21b60 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
21b70 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
21b80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21b90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21ba0 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
21bb0 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
21bc0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
21bd0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
21be0 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
21bf0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
21c00 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
21c10 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
21c20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
21c30 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
21c40 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
21c50 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
21c60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
21c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
21c80 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
21c90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21ca0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
21cb0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
21cc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
21cd0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21ce0 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
21cf0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
21d00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
21d10 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
21d20 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
21d30 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
21d40 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
21d50 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
21d60 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
21d70 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
21d80 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
21d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
21db0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
21dc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
21dd0 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
21de0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
21df0 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
21e00 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
21e10 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
21e20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21e30 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
21e40 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
21e50 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
21e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21e70 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
21e80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21e90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
21ea0 73 20 70 61 72 74 20 6f 66 20 6d 65 72 67 69 6e  s part of mergin
21eb0 67 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  g an CONCURRENT 
21ec0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
21ed0 0a 2a 2a 20 74 68 65 20 73 6e 61 70 73 68 6f 74  .** the snapshot
21ee0 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 20   at the head of 
21ef0 74 68 65 20 77 61 6c 20 66 69 6c 65 2e 20 49 74  the wal file. It
21f00 20 72 65 6c 6f 63 61 74 65 73 20 61 6c 6c 20 70   relocates all p
21f10 61 67 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 72  ages in the.** r
21f20 61 6e 67 65 20 69 46 69 72 73 74 2e 2e 69 4c 61  ange iFirst..iLa
21f30 73 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 49  st, inclusive. I
21f40 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
21f50 74 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61  t the BtreePtrma
21f60 70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  p .** structure 
21f70 61 74 20 42 74 53 68 61 72 65 64 2e 70 4d 61 70  at BtShared.pMap
21f80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
21f90 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 6f  cation of the po
21fa0 69 6e 74 65 72 73 20 74 6f 20 65 61 63 68 0a 2a  inters to each.*
21fb0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 72 61  * page in the ra
21fc0 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e  nge..**.** If pn
21fd0 43 75 72 72 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  Current is NULL,
21fe0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
21ff0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 61 72 65  in the range are
22000 20 6d 6f 76 65 64 20 74 6f 20 63 75 72 72 65 6e   moved to curren
22010 74 6c 79 0a 2a 2a 20 66 72 65 65 20 6c 6f 63 61  tly.** free loca
22020 74 69 6f 6e 73 20 28 69 2e 65 2e 20 66 72 65 65  tions (i.e. free
22030 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 29 20 77  -list entries) w
22040 69 74 68 69 6e 20 74 68 65 20 64 61 74 61 62 61  ithin the databa
22050 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 70  se file before p
22060 61 67 65 0a 2a 2a 20 69 46 69 72 73 74 2e 0a 2a  age.** iFirst..*
22070 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 70 6e 43 75  *.** Or, if pnCu
22080 72 72 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  rrent is not NUL
22090 4c 2c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74  L, then it point
220a0 73 20 74 6f 20 61 20 76 61 6c 75 65 20 63 6f 6e  s to a value con
220b0 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63  taining the.** c
220c0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
220d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
220e0 20 69 6e 20 70 61 67 65 73 2e 20 49 6e 20 74 68   in pages. In th
220f0 69 73 20 63 61 73 65 2c 20 61 6c 6c 20 70 61 67  is case, all pag
22100 65 73 20 61 72 65 0a 2a 2a 20 72 65 6c 6f 63 61  es are.** reloca
22110 74 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ted to the end o
22120 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22130 69 6c 65 20 2d 20 70 61 67 65 20 69 46 69 72 73  ile - page iFirs
22140 74 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 74  t is relocated t
22150 6f 0a 2a 2a 20 70 61 67 65 20 28 2a 70 6e 43 75  o.** page (*pnCu
22160 72 72 65 6e 74 2b 31 29 2c 20 70 61 67 65 20 69  rrent+1), page i
22170 46 69 72 73 74 2b 31 20 74 6f 20 70 61 67 65 20  First+1 to page 
22180 28 2a 70 6e 43 75 72 72 65 6e 74 2b 32 29 2c 20  (*pnCurrent+2), 
22190 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 20 56 61  and so on..** Va
221a0 6c 75 65 20 2a 70 6e 43 75 72 72 65 6e 74 20 69  lue *pnCurrent i
221b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 65 77  s set to the new
221c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
221d0 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 69  abase before thi
221e0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
221f0 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
22200 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
22210 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22220 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
22230 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
22240 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
22250 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 6c  tic int btreeRel
22260 6f 63 61 74 65 52 61 6e 67 65 28 0a 20 20 42 74  ocateRange(.  Bt
22270 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22290 20 42 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   B-tree handle *
222a0 2f 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74 2c  /.  Pgno iFirst,
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
222d0 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f  e to relocate */
222e0 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 2c 20 20  .  Pgno iLast,  
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
22310 74 6f 20 72 65 6c 6f 63 61 74 65 20 2a 2f 0a 20  to relocate */. 
22320 20 50 67 6e 6f 20 2a 70 6e 43 75 72 72 65 6e 74   Pgno *pnCurrent
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
22350 20 49 4e 2f 4f 55 54 3a 20 44 61 74 61 62 61 73   IN/OUT: Databas
22360 65 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 69  e size */.){.  i
22370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22380 4b 3b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  K;.  BtreePtrmap
22390 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
223a0 61 70 3b 0a 20 20 50 67 6e 6f 20 69 50 67 3b 0a  ap;.  Pgno iPg;.
223b0 0a 20 20 66 6f 72 28 69 50 67 3d 69 46 69 72 73  .  for(iPg=iFirs
223c0 74 3b 20 69 50 67 3c 3d 69 4c 61 73 74 20 26 26  t; iPg<=iLast &&
223d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
223e0 69 50 67 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  iPg++){.    MemP
223f0 61 67 65 20 2a 70 46 72 65 65 20 3d 20 30 3b 20  age *pFree = 0; 
22400 20 20 20 20 2f 2a 20 50 61 67 65 20 61 6c 6c 6f      /* Page allo
22410 63 61 74 65 64 20 66 72 6f 6d 20 66 72 65 65 2d  cated from free-
22420 6c 69 73 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  list */.    MemP
22430 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
22440 20 20 50 67 6e 6f 20 69 4e 65 77 3b 20 20 20 20    Pgno iNew;    
22450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
22460 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
22470 20 70 50 67 20 2a 2f 0a 20 20 20 20 50 74 72 6d   pPg */.    Ptrm
22480 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b  apEntry *pEntry;
22490 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
224a0 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
224b0 65 20 69 50 67 20 2a 2f 0a 0a 20 20 20 20 69 66  e iPg */..    if
224c0 28 20 69 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( iPg==PENDING_B
224d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
224e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
224f0 6e 74 72 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50  ntry = &pMap->aP
22500 74 72 5b 69 50 67 20 2d 20 70 4d 61 70 2d 3e 69  tr[iPg - pMap->i
22510 46 69 72 73 74 5d 3b 0a 0a 20 20 20 20 69 66 28  First];..    if(
22520 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 3d 3d   pEntry->eType==
22530 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
22540 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 64 75  ){.      Pgno du
22550 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  mmy;.      rc = 
22560 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
22570 65 28 70 42 74 2c 20 26 70 46 72 65 65 2c 20 26  e(pBt, &pFree, &
22580 64 75 6d 6d 79 2c 20 69 50 67 2c 20 42 54 41 4c  dummy, iPg, BTAL
22590 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
225a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
225b0 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ree);.      asse
225c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
225d0 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d 69 50 67 20  K || dummy==iPg 
225e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
225f0 20 70 6e 43 75 72 72 65 6e 74 20 29 7b 0a 20 20   pnCurrent ){.  
22600 20 20 20 20 62 74 72 65 65 47 65 74 50 61 67 65      btreeGetPage
22610 28 70 42 74 2c 20 69 50 67 2c 20 26 70 50 67 2c  (pBt, iPg, &pPg,
22620 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
22630 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
22640 73 77 72 69 74 65 61 62 6c 65 28 70 50 67 2d 3e  swriteable(pPg->
22650 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
22660 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22670 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
22680 6e 74 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  nt(pPg->pDbPage)
22690 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 4e 65  ==1 );.      iNe
226a0 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e  w = ++(*pnCurren
226b0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e  t);.      if( iN
226c0 65 77 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ew==PENDING_BYTE
226d0 5f 50 41 47 45 28 70 42 74 29 20 29 20 69 4e 65  _PAGE(pBt) ) iNe
226e0 77 20 3d 20 2b 2b 28 2a 70 6e 43 75 72 72 65 6e  w = ++(*pnCurren
226f0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  t);.      rc = r
22700 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
22710 20 70 50 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54   pPg, pEntry->eT
22720 79 70 65 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72  ype, pEntry->par
22730 65 6e 74 2c 20 69 4e 65 77 2c 20 31 29 3b 0a 20  ent, iNew, 1);. 
22740 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22750 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
22760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
22770 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
22780 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
22790 65 2c 20 26 69 4e 65 77 2c 20 69 46 69 72 73 74  e, &iNew, iFirst
227a0 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f 4c 45 29 3b  -1, BTALLOC_LE);
227b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
227c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
227d0 69 4e 65 77 3c 69 46 69 72 73 74 20 29 3b 0a 20  iNew<iFirst );. 
227e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
227f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
22810 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74  ree);.        bt
22820 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22830 69 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  iPg, &pPg, 0);. 
22840 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
22850 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 50  catePage(pBt, pP
22860 67 2c 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65  g, pEntry->eType
22870 2c 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74  , pEntry->parent
22880 2c 69 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20  ,iNew,1);.      
22890 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
228a0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
228b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
228c0 63 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65  c;.}../* !define
228d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
228e0 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20  NCURRENT).**.** 
228f0 54 68 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  The b-tree handl
22900 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
22910 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73  only argument is
22920 20 61 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74   about to commit
22930 20 61 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e   an.** CONCURREN
22940 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  T transaction. A
22950 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
22960 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
22970 61 74 20 74 68 69 73 20 69 73 20 0a 2a 2a 20 70  at this is .** p
22980 6f 73 73 69 62 6c 65 20 2d 20 74 68 65 20 77 61  ossible - the wa
22990 6c 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 69 73  l WRITER lock is
229a0 20 68 65 6c 64 20 61 6e 64 20 69 74 20 69 73 20   held and it is 
229b0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 72 65  known that there
229c0 20 61 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66   are .** no conf
229d0 6c 69 63 74 73 20 77 69 74 68 20 63 6f 6d 6d 69  licts with commi
229e0 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
229f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22a00 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65   btreeFixUnlocke
22a10 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
22a20 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22a30 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
22a40 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
22a50 70 50 61 67 65 31 3b 0a 20 20 75 38 20 2a 70 31  pPage1;.  u8 *p1
22a60 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
22a70 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
22a80 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
22a90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22aa0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
22ab0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
22ac0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 77 72  tabase is not wr
22ad0 69 74 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  itable, then no 
22ae0 70 61 67 65 73 20 77 65 72 65 20 61 6c 6c 6f 63  pages were alloc
22af0 61 74 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65  ated.  ** or fre
22b00 65 64 20 62 79 20 74 68 69 73 20 74 72 61 6e 73  ed by this trans
22b10 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
22b20 63 61 73 65 20 6e 6f 20 73 70 65 63 69 61 6c 20  case no special 
22b30 68 61 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a  handling is .  *
22b40 2a 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  * required. Othe
22b50 72 77 69 73 65 2c 20 69 66 20 70 61 67 65 20 31  rwise, if page 1
22b60 20 69 73 20 64 69 72 74 79 2c 20 70 72 6f 63 65   is dirty, proce
22b70 65 64 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65 50  ed.  */.  BtreeP
22b80 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
22b90 74 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20  t->pMap;.  Pgno 
22ba0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
22bb0 65 28 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67  e(&p1[32]);.  Pg
22bc0 6e 6f 20 6e 50 61 67 65 20 3d 20 62 74 72 65 65  no nPage = btree
22bd0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
22be0 20 20 75 33 32 20 6e 46 72 65 65 20 3d 20 67 65    u32 nFree = ge
22bf0 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b  t4byte(&p1[36]);
22c00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
22c10 3e 70 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20  >pMap );.  rc = 
22c20 73 71 6c 69 74 65 33 50 61 67 65 72 55 70 67 72  sqlite3PagerUpgr
22c30 61 64 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67  adeSnapshot(pPag
22c40 65 72 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50  er, pPage1->pDbP
22c50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
22c60 70 31 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74  p1==pPage1->aDat
22c70 61 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  a );..  if( rc==
22c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22c90 20 50 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67   Pgno nHPage = g
22ca0 65 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29  et4byte(&p1[28])
22cb0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
22cc0 3d 20 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20  = nHPage;       
22cd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
22ce0 61 66 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f  after transactio
22cf0 6e 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20  n merge */..    
22d00 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
22d10 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
22d20 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a  e1->pDbPage) ){.
22d30 20 20 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75        Pgno iHTru
22d40 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
22d50 31 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33  1[32]);.      u3
22d60 32 20 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62  2 nHFree = get4b
22d70 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20  yte(&p1[36]);.. 
22d80 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
22d90 68 65 20 68 65 61 64 20 64 61 74 61 62 61 73 65  he head database
22da0 20 66 72 65 65 20 6c 69 73 74 20 74 6f 20 74 68   free list to th
22db0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72  e end of the cur
22dc0 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 72  rent.      ** tr
22dd0 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 65 65 2d  ansactions free-
22de0 6c 69 73 74 20 28 69 66 20 61 6e 79 29 2e 20 20  list (if any).  
22df0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  */.      if( iTr
22e00 75 6e 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk!=0 ){.      
22e10 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 33    put4byte(&p1[3
22e20 36 5d 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46 72  6], nHFree + nFr
22e30 65 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ee);.        put
22e40 34 62 79 74 65 28 26 70 31 5b 33 32 5d 2c 20 69  4byte(&p1[32], i
22e50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
22e60 77 68 69 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b  while( iTrunk ){
22e70 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
22e80 65 20 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69  e *pTrunk = sqli
22e90 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
22ea0 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a  Pager, iTrunk);.
22eb0 20 20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b            iTrunk
22ec0 20 3d 20 67 65 74 34 62 79 74 65 28 28 75 38 2a   = get4byte((u8*
22ed0 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b  )pTrunk->pData);
22ee0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22ef0 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunk==0 ){.    
22f00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
22f10 28 28 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44  ((u8*)pTrunk->pD
22f20 61 74 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20  ata, iHTrunk);. 
22f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22f40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
22f50 72 55 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a  rUnref(pTrunk);.
22f60 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
22f70 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 48   }..      if( nH
22f80 50 61 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72  Page<(pMap->iFir
22f90 73 74 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  st-1) ){.       
22fa0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22fb0 20 63 6f 6e 73 69 73 74 65 64 20 6f 66 20 28 70   consisted of (p
22fc0 4d 61 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70  Map->iFirst-1) p
22fd0 61 67 65 73 20 77 68 65 6e 20 74 68 65 20 63 75  ages when the cu
22fe0 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  rrent.        **
22ff0 20 63 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e   concurrent tran
23000 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
23010 65 64 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75  ed. And an concu
23020 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23030 6e 20 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  n may.        **
23040 20 6e 6f 74 20 62 65 20 65 78 65 63 75 74 65 64   not be executed
23050 20 6f 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   on an auto-vacu
23060 75 6d 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f  um database - so
23070 20 74 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a   the db should .
23080 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68          ** not h
23090 61 76 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65  ave shrunk since
230a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
230b0 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65   was opened. The
230c0 72 65 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20  refore nHPage.  
230d0 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
230e0 62 65 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d  be set to (pMap-
230f0 3e 69 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72  >iFirst-1) or gr
23100 65 61 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eater. */.      
23110 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
23120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
23130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23140 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
23150 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f  transaction allo
23160 63 61 74 65 64 20 70 61 67 65 73 20 70 4d 61 70  cated pages pMap
23170 2d 3e 69 46 69 72 73 74 20 74 68 72 6f 75 67 68  ->iFirst through
23180 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67  .        ** nPag
23190 65 20 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74  e (inclusive) at
231a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
231b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d  database file. M
231c0 65 61 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20  eanwhile,.      
231d0 20 20 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73    ** other trans
231e0 61 63 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c  actions have all
231f0 6f 63 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e  ocated (iFirst..
23200 6e 48 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65  nHPage). So move
23210 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
23220 73 20 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e  s (iFirst..MIN(n
23230 50 61 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f  Page,nHPage)) to
23240 20 28 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61   (MAX(nPage,nHPa
23250 67 65 29 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20  ge)+1).  */.    
23260 20 20 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d      Pgno iLast =
23270 20 4d 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61   MIN(nPage, nHPa
23280 67 65 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20  ge);    /* Last 
23290 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
232a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75          Pgno nCu
232b0 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  rrent;          
232c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
232d0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64  urrent size of d
232e0 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 75  b */.        nCu
232f0 72 72 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67  rrent = MAX(nPag
23300 65 2c 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20  e, nHPage);.    
23310 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65      rc = btreeRe
23320 6c 6f 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c  locateRange(pBt,
23330 20 70 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69   pMap->iFirst, i
23340 4c 61 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29  Last, &nCurrent)
23350 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
23360 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63  ere are now no c
23370 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74  ollisions with t
23380 68 65 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74  he snapshot at t
23390 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20  he head of the. 
233a0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
233b0 73 65 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74  se file. So at t
233c0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75  his point it wou
233d0 6c 64 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ld be possible t
233e0 6f 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  o write.        
233f0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
23400 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  on out to disk. 
23410 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20  Before doing so 
23420 74 68 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20  though, attempt 
23430 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  to.        ** re
23440 6c 6f 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74  locate some of t
23450 68 65 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20  he new pages to 
23460 66 72 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77  free locations w
23470 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20  ithin the body. 
23480 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
23490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
234a0 69 2e 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65  i.e. free-list e
234b0 6e 74 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20  ntries). */.    
234c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
234d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
234e0 20 20 20 61 73 73 65 72 74 28 20 6e 43 75 72 72     assert( nCurr
234f0 65 6e 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ent!=PENDING_BYT
23500 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
23510 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23520 50 61 67 65 72 53 65 74 44 62 73 69 7a 65 28 70  PagerSetDbsize(p
23530 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72  Bt->pPager, nCur
23540 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rent);.         
23550 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
23560 65 28 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20  e(&p1[36]);.    
23570 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75        nFin = nCu
23580 72 72 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20  rrent-nFree;.   
23590 20 20 20 20 20 20 20 69 66 28 20 6e 43 75 72 72         if( nCurr
235a0 65 6e 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  ent>PENDING_BYTE
235b0 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
235c0 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in<=PENDING_BYTE
235d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
235e0 20 20 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d            nFin--
235f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23600 20 20 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d          nFin = M
23610 41 58 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29  AX(nFin, nHPage)
23620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
23630 20 62 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61   btreeRelocateRa
23640 6e 67 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c  nge(pBt, nFin+1,
23650 20 6e 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20   nCurrent, 0);. 
23660 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23670 20 20 70 75 74 34 62 79 74 65 28 26 70 31 5b 32    put4byte(&p1[2
23680 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
23690 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
236a0 69 74 65 33 50 61 67 65 72 53 65 74 44 62 73 69  ite3PagerSetDbsi
236b0 7a 65 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  ze(pPager, nFin)
236c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
236d0 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
236e0 66 69 6e 65 20 62 74 72 65 65 46 69 78 55 6e 6c  fine btreeFixUnl
236f0 6f 63 6b 65 64 28 58 29 20 20 53 51 4c 49 54 45  ocked(X)  SQLITE
23700 5f 4f 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  _OK.#endif /* SQ
23710 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
23720 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RENT */../*.** T
23730 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
23740 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
23750 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
23760 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
23770 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
23780 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
23790 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
237a0 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
237b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
237c0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
237d0 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
237e0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
237f0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
23800 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
23810 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
23820 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
23830 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
23840 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
23850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
23860 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
23870 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
23880 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
23890 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
238a0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
238b0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
238c0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
238d0 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
238e0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
238f0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
23900 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
23910 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
23920 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
23930 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
23940 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
23950 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
23960 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
23970 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
23980 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
23990 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
239a0 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
239b0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
239c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
239d0 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
239e0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
239f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
23a00 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
23a10 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
23a20 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
23a30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
23a40 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
23a50 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
23a60 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
23a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23a80 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
23a90 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
23aa0 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
23ab0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
23ac0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
23ad0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
23ae0 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
23af0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
23b00 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
23b10 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
23b20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
23b30 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
23b40 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
23b50 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
23b60 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
23b70 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
23b80 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
23b90 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
23ba0 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
23bb0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
23bc0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
23bd0 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
23be0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
23bf0 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
23c00 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
23c10 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
23c20 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
23c30 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
23c40 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
23c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23c60 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
23c70 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
23c80 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
23c90 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
23ca0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
23cb0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
23cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23cd0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
23ce0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
23cf0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
23d00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
23d10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
23d20 65 72 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  er(p);..#ifndef 
23d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23d40 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
23d50 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23d60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23d70 49 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20  ISCONCURRENT==0 
23d80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  );.      rc = au
23d90 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
23da0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
23db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23dd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23e00 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
23e10 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
23e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
23e30 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
23e40 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
23e50 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
23e60 66 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  f.    if( rc==SQ
23e70 4c 49 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e  LITE_OK && ISCON
23e80 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20  CURRENT ){.     
23e90 20 72 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e   rc = btreeFixUn
23ea0 6c 6f 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d  locked(p);.    }
23eb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23ee0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
23ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
23f00 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ster, 0);.    }.
23f10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23f20 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
23f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23f40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23f50 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
23f60 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
23f70 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
23f80 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
23f90 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
23fa0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
23fb0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23fc0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
23fd0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
23fe0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
23ff0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
24000 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24010 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
24020 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
24030 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
24040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24050 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
24060 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
24070 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
24080 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
24090 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
240a0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
240b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
240c0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
240d0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
240e0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
240f0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
24100 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
24110 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
24120 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
24130 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
24140 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
24150 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
24160 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
24170 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
24180 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
24190 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
241a0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
241b0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
241c0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
241d0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
241e0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
241f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
24200 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
24210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
24220 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
24230 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
24240 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
24250 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
24260 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
24270 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
24280 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
24290 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
242a0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
242b0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
242c0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
242d0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
242e0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
242f0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
24300 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
24310 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
24320 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
24330 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
24340 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
24350 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
24360 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
24370 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
24380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24390 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
243a0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
243b0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
243c0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
243d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
243e0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
243f0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
24400 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
24410 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
24420 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
24430 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
24440 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
24450 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
24460 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
24470 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  n CONCURRENT tra
24480 6e 73 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65  nsaction, delete
24490 20 74 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f   the pBt->pMap o
244a0 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f  bject..  ** Also
244b0 20 63 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f   call PagerEndCo
244c0 6e 63 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e  ncurrent() to en
244d0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
244e0 67 65 72 20 68 61 73 20 64 69 73 63 61 72 64 65  ger has discarde
244f0 64 0a 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72  d.  ** the recor
24500 64 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72  d of all pages r
24510 65 61 64 20 77 69 74 68 69 6e 20 74 68 65 20 74  ead within the t
24520 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
24530 20 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c    btreePtrmapDel
24540 65 74 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69  ete(pBt);.  sqli
24550 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75  te3PagerEndConcu
24560 72 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  rrent(pBt->pPage
24570 72 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  r);.  btreeInteg
24580 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
24590 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
245a0 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
245b0 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
245c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
245d0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
245e0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
245f0 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
24600 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
24610 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
24620 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
24630 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
24640 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
24650 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
24660 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
24670 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
24680 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
24690 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
246a0 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
246b0 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
246c0 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
246d0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
246e0 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
246f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
24700 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
24710 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
24720 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
24730 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
24740 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
24750 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
24760 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
24770 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
24780 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
24790 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
247a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
247b0 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
247c0 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
247d0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
247e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
247f0 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
24800 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
24810 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
24820 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
24830 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
24840 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
24850 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
24860 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
24870 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
24880 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
24890 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
248a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
248b0 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
248c0 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
248d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
248e0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
248f0 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
24900 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
24910 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
24920 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
24930 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
24940 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
24950 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
24960 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
24970 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
24980 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
24990 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
249a0 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
249b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
249c0 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
249d0 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
249e0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
249f0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
24a00 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
24a10 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
24a20 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
24a30 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
24a40 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
24a50 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
24a60 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
24a70 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
24a80 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
24a90 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
24aa0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
24ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24ac0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
24ad0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
24ae0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
24af0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
24b00 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
24b10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
24b20 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
24b30 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
24b40 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
24b50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
24b60 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
24b70 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
24b80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24b90 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
24ba0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24bb0 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
24bc0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
24bd0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
24be0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
24bf0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
24c00 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
24c10 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
24c20 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
24c30 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
24c40 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
24c50 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
24c60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
24c70 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
24c80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
24c90 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
24ca0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
24cb0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
24cc0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
24cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
24ce0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
24cf0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
24d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24d10 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
24d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
24d30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
24d40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24d50 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
24d60 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
24d70 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
24d80 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
24d90 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
24da0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
24db0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
24dc0 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
24dd0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
24de0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
24df0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
24e00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24e10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
24e20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24e30 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
24e40 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
24e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24e60 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
24e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
24e80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
24e90 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
24ea0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
24eb0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
24ec0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24ed0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
24ee0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
24ef0 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
24f00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
24f10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
24f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
24f40 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
24f50 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
24f60 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
24f70 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
24f80 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
24f90 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
24fa0 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
24fb0 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
24fc0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
24fd0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
24fe0 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
24ff0 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
25000 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
25010 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
25020 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
25030 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
25040 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
25050 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
25060 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
25070 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
25080 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
25090 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
250a0 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
250b0 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
250c0 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
250d0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
250e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
250f0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
25100 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
25110 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
25120 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
25130 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
25140 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
25150 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
25160 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
25170 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
25180 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
25190 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
251a0 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
251b0 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
251c0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
251d0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
251e0 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
251f0 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
25200 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
25210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
25220 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
25230 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
25240 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
25250 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
25260 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
25270 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
25280 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
25290 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
252a0 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
252b0 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
252c0 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
252d0 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
252e0 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
252f0 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
25300 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
25310 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
25320 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
25330 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
25340 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
25350 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
25360 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
25370 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
25380 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
25390 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
253a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
253b0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
253c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
253d0 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
253e0 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
253f0 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
25400 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
25410 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
25420 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
25430 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
25440 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
25450 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
25460 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
25470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25480 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
25490 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
254a0 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
254b0 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
254c0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
254d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
254e0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
254f0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
25500 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
25510 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
25520 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
25530 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
25540 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
25550 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
25560 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
25570 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
25580 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
25590 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
255a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
255b0 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
255c0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
255d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
255e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
255f0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
25600 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
25610 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
25620 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
25630 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
25640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
25660 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
25670 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
25680 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
25690 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
256a0 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
256b0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
256c0 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52    }.      btreeR
256d0 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
256e0 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ages(p);.    }. 
256f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
25700 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
25710 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25720 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
25730 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
25740 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
25750 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
25760 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
25770 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
25780 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
25790 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
257a0 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
257b0 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
257c0 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
257d0 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
257e0 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
257f0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
25800 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
25810 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
25820 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
25830 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
25840 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
25850 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
25860 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
25870 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
25880 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
25890 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
258a0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
258b0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
258c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
258d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
258e0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
258f0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
25900 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
25910 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
25920 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
25930 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
25940 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
25950 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
25960 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
25970 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
25980 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
25990 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
259a0 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
259b0 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
259c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
259d0 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
259e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
259f0 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
25a00 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
25a10 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
25a20 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
25a30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
25a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25a50 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
25a60 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
25a70 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
25a80 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
25a90 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
25aa0 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
25ab0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
25ac0 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
25ad0 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
25ae0 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
25af0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
25b00 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
25b10 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
25b20 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
25b30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
25b40 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
25b50 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
25b60 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
25b70 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
25b80 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
25b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
25ba0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
25bb0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
25bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25bd0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
25be0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
25bf0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
25c00 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
25c10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
25c20 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
25c30 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
25c40 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
25c50 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
25c60 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
25c70 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
25c80 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
25c90 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
25ca0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
25cb0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
25cc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
25cd0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
25ce0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
25cf0 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
25d00 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
25d10 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
25d20 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
25d30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
25d40 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
25d50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
25d60 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
25d70 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
25d80 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
25d90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25da0 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
25db0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
25dc0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
25dd0 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
25de0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
25df0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
25e00 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
25e10 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
25e20 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
25e30 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
25e40 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
25e50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
25e60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25e70 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
25e80 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
25e90 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
25ea0 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
25eb0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
25ec0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
25ed0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
25ee0 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
25ef0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
25f00 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
25f10 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
25f20 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
25f30 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
25f40 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
25f50 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
25f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
25f70 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
25f80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
25f90 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
25fa0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
25fb0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
25fc0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
25fd0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
25fe0 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
25ff0 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
26000 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
26010 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
26020 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
26030 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
26040 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
26050 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
26060 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
26070 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
26080 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
26090 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
260a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
260b0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
260c0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
260d0 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
260e0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
260f0 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
26100 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
26110 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
26120 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
26130 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
26140 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
26150 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
26160 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
26170 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
26180 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
26190 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
261a0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
261b0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
261c0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
261d0 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
261e0 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
261f0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
26200 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
26210 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
26220 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
26230 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
26240 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
26250 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
26260 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
26270 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
26280 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
26290 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
262a0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
262b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
262c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
262d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
262e0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
262f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
26300 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
26310 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
26320 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
26330 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
26340 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
26350 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
26360 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
26370 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
26380 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
26390 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
263a0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
263b0 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
263c0 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
263d0 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
263e0 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
263f0 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
26400 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
26410 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
26420 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
26430 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
26440 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
26450 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
26460 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
26470 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
26480 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
26490 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
264a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
264b0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
264c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
264d0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 69 66  Statement);.  if
264e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
264f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
26500 65 50 74 72 6d 61 70 42 65 67 69 6e 28 70 42 74  ePtrmapBegin(pBt
26510 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
26520 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
26530 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
26540 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26550 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
26560 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
26570 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
26580 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
26590 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
265a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
265b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
265c0 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
265d0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
265e0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
265f0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
26600 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
26610 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
26620 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
26630 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
26640 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
26650 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
26660 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
26670 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
26680 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
26690 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
266a0 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
266b0 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
266c0 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
266d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
266e0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
266f0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
26700 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
26710 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
26720 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
26730 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
26740 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
26750 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
26760 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
26770 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
26780 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
26790 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
267a0 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
267b0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
267c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
267d0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
267e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
267f0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
26800 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
26810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
26820 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
26830 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
26840 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
26850 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
26860 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
26870 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
26880 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
26890 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
268a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
268b0 72 28 70 29 3b 0a 20 20 20 20 62 74 72 65 65 50  r(p);.    btreeP
268c0 74 72 6d 61 70 45 6e 64 28 70 42 74 2c 20 6f 70  trmapEnd(pBt, op
268d0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
268e0 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
268f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
26900 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
26910 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
26920 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
26930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
26950 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
26960 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
26970 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
26980 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
26990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
269a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
269b0 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
269c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
269d0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
269e0 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
269f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
26a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26a10 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
26a20 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
26a30 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
26a40 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
26a50 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
26a60 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
26a70 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
26a80 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
26a90 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
26aa0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
26ab0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
26ac0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
26ad0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
26ae0 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
26af0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
26b00 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
26b10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
26b20 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
26b30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
26b40 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
26b50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26b60 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
26b70 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
26b80 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
26b90 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
26ba0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
26bb0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
26bc0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
26bd0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
26be0 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
26bf0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
26c00 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
26c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
26c20 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
26c30 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
26c40 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
26c50 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
26c60 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
26c70 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
26c80 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
26c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
26ca0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45  *.** If the BTRE
26cb0 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77  E_WRCSR bit of w
26cc0 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20  rFlag is clear, 
26cd0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
26ce0 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75  can only.** be u
26cf0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
26d00 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57    If the BTREE_W
26d10 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c  RCSR bit is set,
26d20 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
26d30 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
26d40 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
26d50 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  or writing if ot
26d60 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
26d70 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72  or writing.** ar
26d80 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
26d90 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  se are the condi
26da0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
26db0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a  be met in order.
26dc0 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  ** for writing t
26dd0 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  o be allowed:.**
26de0 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
26df0 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
26e00 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
26e10 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Flag containing 
26e20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a  BTREE_WRCSR.**.*
26e30 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
26e40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
26e50 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
26e60 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
26e70 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
26e80 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
26e90 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
26ea0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
26eb0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
26ec0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
26ed0 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
26ee0 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
26ef0 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
26f00 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
26f10 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
26f20 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
26f30 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
26f40 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
26f50 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
26f60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
26f70 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
26f80 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
26f90 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
26fa0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
26fb0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
26fc0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
26fd0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
26fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
26ff0 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f  _FORDELETE bit o
27000 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74  f wrFlag may opt
27010 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69  ionally be set i
27020 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  f BTREE_WRCSR.**
27030 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52   is set.  If FOR
27040 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74  DELETE is set, t
27050 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
27060 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
27070 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  ion that.** this
27080 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c   cursor will onl
27090 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65  y be used to see
270a0 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20  k to and delete 
270b0 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e  entries of an in
270c0 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  dex.** as part o
270d0 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54  f a larger DELET
270e0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
270f0 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74  e FORDELETE hint
27100 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a   is not used by.
27110 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** this implemen
27120 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20  tation.  But in 
27130 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61  a hypothetical a
27140 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61  lternative stora
27150 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e  ge engine .** in
27160 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74   which index ent
27170 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ries are automat
27180 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
27190 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  hen correspondin
271a0 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20  g table.** rows 
271b0 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65  are deleted, the
271c0 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20   FORDELETE flag 
271d0 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61  is a hint that a
271e0 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45  ll SEEK and DELE
271f0 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  TE.** operations
27200 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
27210 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e  can be no-ops an
27220 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61  d all READ opera
27230 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65  tions can .** re
27240 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20  turn a null row 
27250 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30  (2-bytes: 0x01 0
27260 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  x00)..**.** No c
27270 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
27280 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
27290 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
272a0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
272b0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
272c0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
272d0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
272e0 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
272f0 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
27300 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
27310 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
27320 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
27330 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
27340 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
27350 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
27360 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
27370 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
27380 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
27390 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
273a0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
273b0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
273e0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
273f0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
27420 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
27430 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
27440 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
27470 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
27480 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
27490 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
274a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
274b0 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
274c0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
274d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
27500 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
27510 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
27520 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27540 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
27550 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
27560 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
27590 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
275a0 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
275b0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
275c0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
275d0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
275e0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
275f0 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
27600 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
27610 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
27620 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
27630 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
27640 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
27650 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
27660 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
27670 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
27680 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
27690 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
276a0 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
276b0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
276c0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
276d0 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
276e0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
276f0 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
27700 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
27710 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
27720 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
27730 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
27740 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
27750 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
27760 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
27770 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
27780 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
27790 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
277a0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
277b0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
277c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
277d0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
277e0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
277f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
27800 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
27810 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
27820 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
27830 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
27840 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
27850 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
27860 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
27870 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
27880 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
27890 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
278a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
278b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
278c0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
278d0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
278e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
278f0 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
27900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27910 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
27920 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
27930 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
27940 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
27950 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
27960 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
27970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
27980 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
27990 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
279a0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
279b0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
279c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
279d0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
279e0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
279f0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
27a00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
27a10 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
27a20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
27a30 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
27a40 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
27a50 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
27a60 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
27a70 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63  = pBt;.  pCur->c
27a80 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
27a90 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   ? BTCF_WriteFla
27aa0 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  g : 0;.  pCur->c
27ab0 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77  urPagerFlags = w
27ac0 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45  rFlag ? 0 : PAGE
27ad0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a  R_GET_READONLY;.
27ae0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
27af0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
27b00 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
27b10 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
27b20 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73  l such.  ** curs
27b30 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20  ors *must* have 
27b40 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
27b50 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20  e flag set. */. 
27b60 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75   for(pX=pBt->pCu
27b70 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d  rsor; pX; pX=pX-
27b80 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
27b90 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28   pX->pgnoRoot==(
27ba0 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
27bb0 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67       pX->curFlag
27bc0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
27bd0 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  le;.      pCur->
27be0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
27bf0 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d  _Multiple;.    }
27c00 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65  .  }.  pCur->pNe
27c10 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
27c20 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  r;.  pBt->pCurso
27c30 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
27c40 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27c50 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
27c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27c70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27c80 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
27c90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
27cc0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
27cd0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
27d00 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
27d10 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
27d20 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
27d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d40 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
27d50 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
27d60 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
27d70 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d90 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
27da0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
27db0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
27de0 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
27df0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
27e00 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c   rc;.  if( iTabl
27e10 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  e<1 ){.    rc = 
27e20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27e30 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
27e40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
27e50 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
27e60 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
27e70 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
27e80 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
27e90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
27ea0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
27eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
27ed0 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
27ee0 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
27ef0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
27f00 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
27f10 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
27f20 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
27f30 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
27f40 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
27f50 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
27f60 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
27f70 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
27f80 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
27f90 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
27fa0 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
27fb0 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
27fc0 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
27fd0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
27fe0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
27ff0 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
28000 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
28010 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
28020 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
28030 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
28040 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
28050 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
28060 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
28070 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
28080 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
28090 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
280a0 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
280b0 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
280c0 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
280d0 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
280e0 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
280f0 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
28100 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
28110 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
28120 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
28130 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
28140 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
28150 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
28160 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
28170 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
28180 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
28190 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
281a0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
281b0 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
281c0 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55  f(BtCursor, BTCU
281d0 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49  RSOR_FIRST_UNINI
281e0 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  T));.}../*.** Cl
281f0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
28200 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
28210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28220 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
28230 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
28240 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
28250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
28260 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
28270 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28280 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
28290 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
282a0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
282b0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
282c0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
282d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
282e0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
282f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28300 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
28310 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
28320 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  or==pCur ){.    
28330 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
28340 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
28350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
28360 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d  tCursor *pPrev =
28370 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
28380 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
28390 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78   if( pPrev->pNex
283a0 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  t==pCur ){.     
283b0 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
283c0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
283d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
283e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
283f0 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65      pPrev = pPre
28400 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  v->pNext;.      
28410 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70  }while( ALWAYS(p
28420 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Prev) );.    }. 
28430 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
28440 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
28450 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ur);.    unlockB
28460 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
28470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28480 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
28490 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  low);.    sqlite
284a0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
284b0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  y);.    sqlite3B
284c0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
284d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
284e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
284f0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
28500 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
28510 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
28520 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
28530 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
28540 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
28550 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
28560 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
28570 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
28580 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
28590 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
285a0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
285b0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
285c0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
285d0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
285e0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
285f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
28600 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
28610 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
28620 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
28630 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e  tatic int cellIn
28640 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f  foEqual(CellInfo
28650 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62   *a, CellInfo *b
28660 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b  ){.    if( a->nK
28670 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65  ey!=b->nKey ) re
28680 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
28690 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e  a->pPayload!=b->
286a0 70 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72  pPayload ) retur
286b0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
286c0 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61  nPayload!=b->nPa
286d0 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30  yload ) return 0
286e0 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f  ;.    if( a->nLo
286f0 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29  cal!=b->nLocal )
28700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
28710 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e  f( a->nSize!=b->
28720 6e 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30  nSize ) return 0
28730 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
28740 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69    }.  static voi
28750 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
28760 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
28770 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
28780 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
28790 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
287a0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
287b0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
287c0 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
287d0 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  x, &info);.    a
287e0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
287f0 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75  B || cellInfoEqu
28800 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  al(&info, &pCur-
28810 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65  >info) );.  }.#e
28820 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
28830 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
28840 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
28850 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
28860 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
28870 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28880 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
28890 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
288a0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
288b0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
288c0 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  y;.    btreePars
288d0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
288e0 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72  e,pCur->ix,&pCur
288f0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  ->info);.  }else
28900 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c  {.    assertCell
28910 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Info(pCur);.  }.
28920 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
28930 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
28940 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
28950 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
28960 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
28970 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
28980 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
28990 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
289a0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
289b0 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
289c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
289d0 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
289e0 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
289f0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
28a00 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
28a10 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
28a20 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
28a30 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
28a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28a50 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
28a60 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
28a70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
28a80 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
28a90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
28aa0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
28ab0 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  BUG */.int sqlit
28ac0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
28ad0 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20  alidNN(BtCursor 
28ae0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
28af0 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72  ( pCur!=0 );.  r
28b00 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
28b10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28b30 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
28b40 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f  he integer key o
28b50 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20  r "rowid" for a 
28b60 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20  table btree..** 
28b70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28b80 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61  only valid for a
28b90 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20   cursor that is 
28ba0 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a  pointing into a.
28bb0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  ** ordinary tabl
28bc0 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65  e btree.  If the
28bd0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
28be0 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65  o an index btree
28bf0 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69   or.** is invali
28c00 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  d, the result of
28c10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28c20 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
28c30 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  64 sqlite3BtreeI
28c40 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73  ntegerKey(BtCurs
28c50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
28c60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28c70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28c80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28c90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28ca0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28cb0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
28cc0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
28cd0 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  o(pCur);.  retur
28ce0 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  n pCur->info.nKe
28cf0 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  y;.}..#ifdef SQL
28d00 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
28d10 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a  T_SQL_FUNC./*.**
28d20 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
28d30 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  et into the data
28d40 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
28d50 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
28d60 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69  * payload to whi
28d70 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
28d80 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36   pointing..*/.i6
28d90 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66  4 sqlite3BtreeOf
28da0 66 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70  fset(BtCursor *p
28db0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
28dc0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28dd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28de0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28df0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28e00 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
28e10 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
28e20 28 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e  (i64)pCur->pBt->
28e30 70 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70  pageSize*((i64)p
28e40 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  Cur->pPage->pgno
28e50 20 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20   - 1) +.        
28e60 20 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66   (i64)(pCur->inf
28e70 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75  o.pPayload - pCu
28e80 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29  r->pPage->aData)
28e90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
28ea0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
28eb0 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a  ET_SQL_FUNC */..
28ec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
28ed0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
28ee0 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20   of payload for 
28ef0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70  the entry that p
28f00 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  Cur is.** curren
28f10 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
28f20 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65    For table btre
28f30 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
28f40 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
28f50 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64  f data.  For ind
28f60 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20  ex btrees, this 
28f70 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65  will be the size
28f80 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a   of the key..**.
28f90 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
28fa0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
28fb0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
28fc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
28fd0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
28fe0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
28ff0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
29000 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
29010 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
29020 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
29030 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
29040 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
29050 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42  .*/.u32 sqlite3B
29060 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
29070 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
29080 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29090 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
290a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
290b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
290c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
290d0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
290e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
290f0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
29100 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
29110 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29120 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
29130 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
29140 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
29150 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
29160 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
29170 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
29180 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
29190 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
291a0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
291b0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
291c0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
291d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
291e0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
291f0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
29200 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
29210 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
29220 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
29230 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
29240 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
29250 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
29260 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
29270 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
29280 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
29290 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
292a0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
292b0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
292c0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
292d0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
292e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
292f0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
29300 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
29310 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
29320 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
29330 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
29340 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
29350 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
29360 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
29370 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
29380 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
29390 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
293a0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
293b0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
293c0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
293d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
293e0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
293f0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
29400 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
29410 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
29420 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
29430 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
29440 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
29450 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
29460 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
29470 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
29480 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
29490 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
294a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
294b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
294c0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
294d0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
294e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
294f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
29500 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
29510 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
29520 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
29530 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
29540 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
29550 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
29560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
29570 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
29580 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
29590 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
295a0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
295b0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
295c0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
295d0 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
295e0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
295f0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29600 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29610 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
29620 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29630 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
29640 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
29650 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
29660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29670 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
29680 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
29690 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
296a0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
296b0 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
296c0 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
296d0 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
296e0 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
296f0 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
29700 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
29710 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
29720 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
29730 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
29740 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
29750 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
29760 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
29770 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
29780 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
29790 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
297a0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
297b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
297c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
297d0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
297e0 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
297f0 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
29800 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
29810 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
29820 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
29830 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
29840 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
29850 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
29860 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
29870 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
29880 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
29890 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
298a0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
298b0 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
298c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
298d0 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
298e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
298f0 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
29900 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
29910 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
29920 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
29930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29940 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
29950 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
29960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
29970 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
29980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
29990 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
299a0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
299b0 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
299c0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
299d0 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
299e0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
299f0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
29a00 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
29a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29a20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
29a30 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
29a40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
29a50 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
29a60 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
29a70 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
29a80 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
29a90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29aa0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
29ab0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
29ac0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
29ad0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
29ae0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
29af0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
29b00 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
29b10 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
29b20 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
29b30 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
29b40 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
29b50 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
29b60 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
29b70 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
29b80 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
29b90 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
29ba0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
29bb0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
29bc0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
29bd0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
29be0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
29bf0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
29c00 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
29c10 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
29c20 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
29c30 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
29c40 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
29c50 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
29c60 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
29c70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
29c80 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
29c90 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
29ca0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
29cb0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
29cc0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
29cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29ce0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
29cf0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
29d00 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
29d10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
29d20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
29d30 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
29d40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29d50 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
29d60 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
29d90 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
29da0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
29db0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
29dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
29dd0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
29de0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
29df0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
29e00 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
29e10 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
29e20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
29e30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
29e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29e50 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
29e60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
29e80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29e90 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
29ea0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
29eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29ec0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
29ed0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
29ee0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
29ef0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
29f00 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
29f10 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
29f20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29f30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
29f40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
29f50 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
29f60 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
29f70 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
29f80 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
29f90 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
29fa0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
29fb0 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
29fc0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
29fd0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
29fe0 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
29ff0 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
2a000 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
2a010 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
2a020 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
2a030 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
2a040 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
2a050 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
2a060 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
2a070 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
2a080 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
2a090 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
2a0a0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
2a0b0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
2a0c0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
2a0d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
2a0e0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
2a0f0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
2a100 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
2a110 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
2a120 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
2a130 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
2a140 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
2a150 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
2a160 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
2a170 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2a180 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68  flow pages.** th
2a190 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
2a1a0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
2a1b0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
2a1c0 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76  pulate.** the ov
2a1d0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
2a1e0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
2a1f0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
2a200 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
2a210 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
2a220 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
2a230 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
2a240 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
2a250 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
2a260 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
2a270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
2a280 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
2a290 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
2a2a0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
2a2b0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
2a2c0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
2a2d0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
2a2e0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
2a2f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2a300 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
2a310 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
2a320 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
2a330 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
2a340 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
2a350 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
2a360 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2a370 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
2a380 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
2a390 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
2a3a0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
2a3b0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
2a3c0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
2a3d0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
2a3e0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
2a3f0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
2a400 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
2a410 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
2a420 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
2a430 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
2a440 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
2a450 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
2a460 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
2a470 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
2a480 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
2a490 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
2a4a0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
2a4b0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
2a4c0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
2a4d0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
2a4e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
2a4f0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
2a500 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
2a510 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
2a520 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
2a530 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
2a540 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
2a550 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
2a560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
2a570 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
2a580 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a590 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
2a5a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2a5b0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20   pCur->pPage;   
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2a5d0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
2a5e0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
2a5f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a600 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
2a610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2a620 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
2a630 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
2a640 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
2a650 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
2a660 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
2a670 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
2a680 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20  art = pBuf;     
2a690 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67  /* Start of orig
2a6a0 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20  inal out buffer 
2a6b0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
2a6c0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
2a6d0 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c  assert( eOp==0 |
2a6e0 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73  | eOp==1 );.  as
2a6f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a700 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a720 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2a730 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2a740 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2a750 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
2a760 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
2a770 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
2a780 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a790 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  d;.  assert( off
2a7a0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
2a7b0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
2a7c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
2a7d0 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
2a7e0 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
2a7f0 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
2a800 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
2a810 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2a820 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
2a830 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
2a840 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
2a850 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
2a860 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2a870 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
2a880 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
2a890 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
2a8a0 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
2a8b0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
2a8c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
2a8d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2a8e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
2a8f0 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
2a900 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
2a910 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
2a920 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
2a930 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
2a940 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
2a950 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2a960 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  GE(pPage);.  }..
2a970 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
2a980 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
2a990 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
2a9a0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
2a9b0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
2a9c0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
2a9d0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
2a9e0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
2a9f0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
2aa00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
2aa10 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
2aa20 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
2aa30 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
2aa40 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
2aa50 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
2aa60 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
2aa70 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
2aa80 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
2aa90 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
2aaa0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
2aab0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
2aac0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
2aad0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
2aae0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
2aaf0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
2ab00 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
2ab10 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
2ab20 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
2ab30 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
2ab40 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
2ab50 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
2ab60 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
2ab70 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2ab80 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
2ab90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
2aba0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
2abb0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
2abc0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
2abd0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
2abe0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
2abf0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
2ac00 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
2ac10 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
2ac20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
2ac30 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
2ac40 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
2ac50 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
2ac60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2ac70 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2ac80 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
2ac90 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
2aca0 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
2acb0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
2acc0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
2acd0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
2ace0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
2acf0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
2ad00 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
2ad10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ad20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2ad30 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2ad40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
2ad50 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
2ad60 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
2ad70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
2ad80 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
2ad90 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
2ada0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2adb0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f  ==0.       || nO
2adc0 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28  vfl*(int)sizeof(
2add0 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d  Pgno) > sqlite3M
2ade0 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e  allocSize(pCur->
2adf0 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20  aOverflow).     
2ae00 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2ae10 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29   *aNew = (Pgno*)
2ae20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2ae40 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
2ae50 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
2ae60 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2ae70 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
2ae80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2ae90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2aea0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2aeb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2aec0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2aed0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
2aee0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2aef0 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
2af00 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
2af10 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
2af20 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2af30 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
2af40 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c  lidOvfl;.    }el
2af50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
2af60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2af70 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
2af80 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
2af90 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
2afa0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
2afb0 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
2afc0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
2afd0 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20  alid, skip.     
2afe0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
2aff0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
2b000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
2b010 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
2b020 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
2b030 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
2b040 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
2b050 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
2b060 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
2b070 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f  iIdx];.        o
2b080 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
2b090 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
2b0a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
2b0b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2b0c0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a  _OK && amt>0 );.
2b0d0 20 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50      while( nextP
2b0e0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  age ){.      /* 
2b0f0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
2b100 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
2b110 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
2b120 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  he. */.      ass
2b130 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72  ert( pCur->aOver
2b140 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20  flow[iIdx]==0.  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2b160 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
2b170 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2b190 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
2b1a0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
2b1b0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
2b1c0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  Page;..      if(
2b1d0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
2b1e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
2b1f0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
2b200 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
2b210 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
2b220 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
2b230 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2b240 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
2b250 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
2b260 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
2b270 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
2b280 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
2b290 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
2b2a0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
2b2b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2b2c0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
2b2d0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
2b2e0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
2b2f0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
2b300 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2b310 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b320 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2b330 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2b340 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
2b350 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b360 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b370 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
2b380 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
2b390 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
2b3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
2b3b0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
2b3c0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
2b3d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b3e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b3f0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2b400 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
2b410 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
2b420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b430 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
2b440 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
2b450 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
2b460 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
2b470 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
2b480 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
2b490 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2b4a0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
2b4b0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
2b4c0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
2b4d0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
2b4e0 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
2b4f0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
2b500 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
2b510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2b520 65 20 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46  e *fd;      /* F
2b530 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ile from which t
2b540 6f 20 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72  o do direct over
2b550 66 6c 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e  flow read */.#en
2b560 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dif.        int 
2b570 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
2b580 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
2b590 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
2b5a0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
2b5b0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
2b5c0 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
2b5d0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
2b5e0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
2b5f0 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
2b600 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2b610 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
2b620 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
2b630 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
2b640 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
2b650 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
2b660 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
2b670 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
2b680 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
2b690 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
2b6a0 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72      **   3) ther
2b6b0 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
2b6c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
2b6d0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
2b6e0 20 34 29 20 74 68 65 20 64 61 74 61 62 61 73 65   4) the database
2b6f0 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
2b700 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
2b710 20 20 35 29 20 74 68 65 20 70 61 67 65 20 69 73    5) the page is
2b720 20 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20   not in the WAL 
2b730 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
2b740 20 20 36 29 20 61 74 20 6c 65 61 73 74 20 34 20    6) at least 4 
2b750 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
2b760 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
2b770 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
2b780 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
2b790 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2b7a0 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
2b7b0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
2b7c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b7d0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2b7e0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
2b7f0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
2b800 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
2b810 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
2b820 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
2b830 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
2b840 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
2b850 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
2b860 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
2b870 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  */.        if( e
2b880 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  Op==0           
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8b0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
2b8c0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
2b8d0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2b900 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
2b910 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2b920 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
2b950 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
2b960 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2b970 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
2b980 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
2b990 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
2b9a0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67  && 0==sqlite3Pag
2b9b0 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50  erUseWal(pBt->pP
2b9c0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20  ager, nextPage) 
2b9d0 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
2b9e0 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
2b9f0 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ba20 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
2ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
2ba40 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
2ba50 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
2ba60 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
2ba70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
2ba80 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
2ba90 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2bab0 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20  ue to (6) */.   
2bac0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
2bad0 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
2bae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2baf0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
2bb00 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
2bb10 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
2bb20 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
2bb30 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
2bb40 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
2bb50 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
2bb60 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
2bb70 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
2bb80 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2bb90 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
2bba0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
2bbb0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
2bbc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2bbd0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
2bbe0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
2bbf0 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
2bc00 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50       (eOp==0 ? P
2bc10 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
2bc20 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
2bc30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2bc40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bc50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2bc60 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
2bc70 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2bc80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2bc90 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
2bca0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
2bcb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2bcc0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
2bcd0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
2bce0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
2bcf0 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
2bd00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bd10 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
2bd20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2bd30 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
2bd40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bd50 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
2bd60 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = a;.        if(
2bd70 20 61 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e   amt==0 ) return
2bd80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75   rc;.        pBu
2bd90 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
2bda0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2bdb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78  reak;.      iIdx
2bdc0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
2bdd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bde0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
2bdf0 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63     /* Overflow c
2be00 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74  hain ends premat
2be10 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  urely */.    ret
2be20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2be30 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
2be40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2be50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
2be60 61 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f  art of the paylo
2be70 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61  ad for the row a
2be80 74 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72  t which that cur
2be90 73 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72  sor pCur is curr
2bea0 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ently.** pointin
2beb0 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20  g.  "amt" bytes 
2bec0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
2bed0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
2bee0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
2bef0 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
2bf00 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  set"..**.** pCur
2bf10 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67   can be pointing
2bf20 20 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62   to either a tab
2bf30 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  le or an index b
2bf40 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69  -tree..** If poi
2bf50 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  nting to a table
2bf60 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65   btree, then the
2bf70 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e   content section
2bf80 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a   is read.  If.**
2bf90 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
2bfa0 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d  g to an index b-
2bfb0 74 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65  tree then the ke
2bfc0 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61  y section is rea
2bfd0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c  d..**.** For sql
2bfe0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
2bff0 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  (), the caller m
2c000 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
2c010 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
2c020 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72  .** to a valid r
2c030 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ow in the table.
2c040 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72    For sqlite3Btr
2c050 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
2c060 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  (), the.** curso
2c070 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c  r might be inval
2c080 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64  id or might need
2c090 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20   to be restored 
2c0a0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61  before being rea
2c0b0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
2c0c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2c0d0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
2c0e0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
2c0f0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
2c100 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
2c110 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
2c120 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
2c130 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
2c140 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
2c150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c160 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72  reePayload(BtCur
2c170 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
2c180 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
2c190 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61  void *pBuf){.  a
2c1a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2c1b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2c1c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c1d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2c1e0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2c1f0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2c200 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
2c210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c220 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
2c230 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  ge->nCell );.  r
2c240 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
2c250 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
2c260 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
2c270 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
2c280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
2c290 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65  ariant of sqlite
2c2a0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20  3BtreePayload() 
2c2b0 77 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68  works even if th
2c2c0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
2c2d0 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f  .** in the CURSO
2c2e0 52 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20  R_VALID state.  
2c2f0 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2c300 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  by the sqlite3_b
2c310 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e  lob_read().** in
2c320 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  terface..*/.#ifn
2c330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c340 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20  INCRBLOB.static 
2c350 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2c360 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
2c370 64 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75  dChecked(.  BtCu
2c380 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33  rsor *pCur,.  u3
2c390 32 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20  2 offset,.  u32 
2c3a0 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75  amt,.  void *pBu
2c3b0 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  f.){.  int rc;. 
2c3c0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
2c3d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2c3e0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
2c3f0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
2c400 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72   }.  assert( cur
2c410 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c420 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
2c430 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
2c440 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2c450 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
2c460 72 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f  rc : accessPaylo
2c470 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
2c480 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
2c490 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2c4a0 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  eePayloadChecked
2c4b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2c4c0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
2c4d0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
2c4e0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ){.  if( pCur->e
2c4f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2c500 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2c510 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2c520 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2c530 20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73     return access
2c540 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
2c550 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
2c560 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
2c570 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
2c580 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43  ayloadChecked(pC
2c590 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
2c5a0 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65   pBuf);.  }.}.#e
2c5b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2c5c0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
2c5d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2c5e0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
2c5f0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
2c600 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
2c610 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
2c620 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
2c630 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
2c640 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
2c650 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
2c660 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
2c670 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
2c680 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
2c690 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
2c6a0 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
2c6b0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
2c6c0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
2c6d0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
2c6e0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
2c6f0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2c700 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
2c710 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
2c720 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
2c730 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
2c740 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
2c750 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2c760 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2c770 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
2c780 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
2c790 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
2c7a0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
2c7b0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
2c7c0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
2c7d0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
2c7e0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
2c7f0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
2c800 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2c810 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
2c820 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
2c830 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
2c840 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
2c850 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
2c860 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
2c870 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
2c880 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
2c890 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
2c8a0 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
2c8b0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
2c8c0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
2c8d0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
2c8e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
2c8f0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
2c900 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
2c910 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
2c920 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
2c930 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
2c940 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
2c950 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
2c960 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
2c970 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
2c980 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
2c990 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c9a0 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
2c9b0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
2c9c0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
2c9d0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
2c9e0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
2c9f0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
2ca00 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
2ca10 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
2ca20 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
2ca30 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
2ca40 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73  .  int amt;.  as
2ca50 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
2ca60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2ca70 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  && pCur->pPage);
2ca80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ca90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2caa0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2cab0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2cac0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2cad0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2cae0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2caf0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2cb00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2cb10 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2cb20 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2cb30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2cb40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
2cb50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2cb60 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70  >info.pPayload>p
2cb70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
2cb80 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
2cb90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2cba0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
2cbb0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  <pCur->pPage->aD
2cbc0 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
2cbd0 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43  _DB);.  amt = pC
2cbe0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
2cbf0 0a 20 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29  .  if( amt>(int)
2cc00 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
2cc10 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
2cc20 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b  nfo.pPayload) ){
2cc30 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
2cc40 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63   too little spac
2cc50 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f  e on the page fo
2cc60 72 20 74 68 65 20 65 78 70 65 63 74 65 64 20 61  r the expected a
2cc70 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20  mount.    ** of 
2cc80 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44  local content. D
2cc90 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2cca0 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2ccb0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
2ccc0 44 42 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20  DB );.    amt = 
2ccd0 4d 41 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75  MAX(0, (int)(pCu
2cce0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
2ccf0 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
2cd00 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a  pPayload));.  }.
2cd10 20 20 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61    *pAmt = (u32)a
2cd20 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
2cd30 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
2cd40 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
2cd50 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
2cd60 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
2cd70 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
2cd80 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
2cd90 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
2cda0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
2cdb0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
2cdc0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
2cdd0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
2cde0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
2cdf0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
2ce00 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
2ce10 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
2ce20 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
2ce30 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
2ce40 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
2ce50 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
2ce60 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
2ce70 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
2ce80 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
2ce90 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
2cea0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
2ceb0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
2cec0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
2ced0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
2cee0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
2cef0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
2cf00 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
2cf10 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
2cf20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
2cf30 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
2cf40 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
2cf50 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
2cf60 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
2cf70 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
2cf80 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
2cf90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
2cfa0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
2cfb0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
2cfc0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
2cfd0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
2cfe0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
2cff0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
2d000 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2d010 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
2d020 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
2d030 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
2d040 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
2d050 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
2d060 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
2d070 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d080 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2d090 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2d0a0 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
2d0b0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
2d0c0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
2d0d0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
2d0e0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
2d0f0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
2d100 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
2d110 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
2d120 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
2d130 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
2d140 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
2d150 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
2d160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2d170 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
2d180 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
2d190 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
2d1a0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
2d1b0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Bt;.  int rc;.. 
2d1c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2d1d0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2d1e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d1f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d200 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2d210 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2d220 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2d230 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2d240 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2d250 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2d260 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2d270 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2d280 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d290 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d2a0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2d2b0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2d2c0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d2d0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2d2e0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2d2f0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
2d300 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2d310 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
2d320 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d330 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
2d340 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
2d350 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
2d360 61 67 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 67 65  age++;.  rc = ge
2d370 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2d380 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
2d390 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20 20  ->pPage,.       
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3b0 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
2d3c0 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 69  PagerFlags);.  i
2d3d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d3e0 20 29 7b 0a 20 20 20 20 73 65 74 4d 65 6d 70 61   ){.    setMempa
2d3f0 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70 50 61  geRoot(pCur->pPa
2d400 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  ge, pCur->pgnoRo
2d410 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ot);.  }.  retur
2d420 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
2d430 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
2d440 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
2d450 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
2d460 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
2d470 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
2d480 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
2d490 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
2d4a0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
2d4b0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
2d4c0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
2d4d0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
2d4e0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
2d4f0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
2d500 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
2d510 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2d520 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
2d530 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2d540 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
2d550 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
2d560 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2d570 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
2d580 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2d590 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
2d5a0 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
2d5b0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
2d5c0 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
2d5d0 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
2d5e0 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
2d5f0 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d610 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
2d620 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
2d630 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
2d640 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
2d650 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
2d660 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2d670 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2d680 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2d690 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2d6a0 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
2d6b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2d6c0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
2d6d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
2d6e0 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
2d6f0 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
2d700 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
2d710 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
2d720 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
2d730 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2d740 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
2d750 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
2d760 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
2d770 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
2d780 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
2d790 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
2d7a0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
2d7b0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
2d7c0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
2d7d0 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
2d7e0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2d7f0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
2d800 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
2d810 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
2d820 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
2d830 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
2d840 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
2d850 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
2d860 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2d870 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20  Leaf;.  assert( 
2d880 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d890 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2d8a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d8b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2d8c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d8d0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
2d8e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2d8f0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
2d900 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
2d910 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d920 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
2d930 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2d940 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2d950 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d      pCur->pPage-
2d960 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
2d970 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
2d980 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2d990 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
2d9a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
2d9b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72  >nCell );.  pCur
2d9c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d9d0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2d9e0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2d9f0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2da00 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
2da10 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  ix = pCur->aiIdx
2da20 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
2da30 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d  .  pLeaf = pCur-
2da40 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2da50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2da60 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61  Page[--pCur->iPa
2da70 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge];.  releasePa
2da80 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29  geNotNull(pLeaf)
2da90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2daa0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
2dab0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
2dac0 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
2dad0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
2dae0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
2daf0 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
2db00 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
2db10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
2db20 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
2db30 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
2db40 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
2db50 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
2db60 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
2db70 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
2db80 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
2db90 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
2dba0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2dbb0 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
2dbc0 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
2dbd0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
2dbe0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
2dbf0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2dc00 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
2dc10 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
2dc20 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
2dc30 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
2dc40 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
2dc50 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
2dc60 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
2dc70 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
2dc80 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73  _EMPTY. Otherwis
2dc90 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  e,.** the cursor
2dca0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
2dcb0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 65   to the first ce
2dcc0 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
2dcd0 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69  e root.** (or vi
2dce0 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
2dcf0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2dd00 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2dd10 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
2dd20 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
2dd30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
2dd40 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
2dd50 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
2dd60 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
2dd70 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
2dd80 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
2dd90 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
2dda0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
2ddb0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
2ddc0 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
2ddd0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
2dde0 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
2ddf0 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
2de00 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2de10 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
2de20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
2de30 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
2de40 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
2de50 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
2de60 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
2de70 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
2de80 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
2de90 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2dea0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2deb0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
2dec0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
2ded0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
2dee0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
2def0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
2df00 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2df10 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
2df20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2df30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2df40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2df50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2df60 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
2df70 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2df80 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2df90 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
2dfa0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2dfb0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2dfc0 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
2dfd0 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
2dfe0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2dff0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  t( pCur->eState 
2e000 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2e010 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50  SEEK || pCur->iP
2e020 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  age<0 );.  asser
2e030 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2e040 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  t>0 || pCur->iPa
2e050 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge<0 );..  if( p
2e060 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
2e070 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2e080 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Page ){.      re
2e090 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
2e0a0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
2e0b0 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43       while( --pC
2e0c0 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2e0d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e0e0 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
2e0f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2e100 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2e110 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
2e120 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2e130 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70  .      goto skip
2e140 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  _init;.    }.  }
2e150 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
2e160 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
2e170 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e180 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2e190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e1a0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73  TE_EMPTY;.  }els
2e1b0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2e1c0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
2e1d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
2e1e0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2e1f0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
2e200 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2e210 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2e220 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AULT ){.        
2e230 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e240 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
2e250 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
2e260 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
2e270 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
2e280 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
2e290 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
2e2a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e2b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2e2c0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
2e2d0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2e2e0 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a  , &pCur->pPage,.
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e300 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d          0, pCur-
2e310 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
2e320 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e340 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e350 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e370 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4d 65 6d      }.    setMem
2e380 70 61 67 65 52 6f 6f 74 28 70 43 75 72 2d 3e 70  pageRoot(pCur->p
2e390 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  Page, pCur->pgno
2e3a0 52 6f 6f 74 29 3b 0a 20 20 20 20 70 43 75 72 2d  Root);.    pCur-
2e3b0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2e3c0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2e3d0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2e3e0 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2e3f0 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2e400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2e410 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2e420 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2e430 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2e440 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2e450 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2e460 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2e470 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2e480 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2e490 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2e4a0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2e4b0 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2e4c0 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2e4d0 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2e4e0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2e4f0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2e500 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2e510 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2e520 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2e530 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2e540 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2e550 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2e560 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2e570 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2e580 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2e590 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2e5a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2e5b0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2e5c0 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2e5d0 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2e5e0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2e5f0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e600 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2e610 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2e620 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2e630 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2e640 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2e650 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2e660 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2e670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2e680 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2e690 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2e6a0 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2e6b0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2e6c0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2e6d0 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2e6e0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2e6f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2e700 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2e710 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2e720 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2e730 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2e740 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2e750 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e760 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2e770 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e780 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2e790 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2e7a0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2e7b0 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2e7c0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e7d0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2e7e0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2e7f0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2e800 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2e810 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2e820 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2e830 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e840 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2e850 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2e860 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2e870 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2e880 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2e890 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2e8a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2e8b0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2e8c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2e8d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e8e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e8f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2e900 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2e910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e920 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2e930 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2e940 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2e950 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2e960 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2e970 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2e980 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2e990 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2e9a0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2e9b0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2e9c0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2e9d0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2e9e0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2e9f0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2ea00 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2ea10 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2ea20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ea30 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2ea40 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2ea50 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ea60 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ea70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ea80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2ea90 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2eaa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2eab0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2eac0 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2ead0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2eae0 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2eaf0 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2eb00 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2eb10 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2eb20 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2eb30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2eb40 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2eb50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2eb60 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2eb70 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2eb80 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2eb90 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2eba0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2ebb0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2ebc0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2ebd0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2ebe0 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2ebf0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2ec00 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2ec10 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2ec20 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2ec30 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2ec40 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2ec50 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2ec60 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2ec70 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2ec80 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2ec90 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2eca0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2ecb0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2ecc0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2ecd0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2ece0 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2ecf0 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2ed00 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2ed10 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2ed20 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2ed30 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2ed40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ed50 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2ed60 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2ed70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2ed80 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ed90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2eda0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2edb0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2edc0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2edd0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2ede0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2edf0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ee00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ee10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ee20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2ee30 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2ee40 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ee50 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2ee60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ee70 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2ee80 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2ee90 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2eea0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2eeb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2eec0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2eed0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2eee0 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2eef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ef00 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2ef10 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2ef20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2ef30 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2ef40 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2ef50 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2ef60 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2ef70 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2ef80 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2ef90 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2efa0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2efb0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2efc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2efd0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2efe0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2eff0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2f000 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f010 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f020 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2f030 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2f040 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2f050 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2f060 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2f070 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2f080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2f090 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2f0a0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2f0b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2f0c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2f0d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f0e0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f0f0 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2f100 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2f110 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2f120 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2f130 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2f140 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2f150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2f160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f170 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f180 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
2f190 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65 73  cursor pCur does
2f1a0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
2f1b0 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74  valid row..** Ot
2f1c0 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72  herwise, if pCur
2f1d0 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69   is valid, confi
2f1e0 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74 20  gure it so that 
2f1f0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
2f200 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
2f210 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Next() is a no-o
2f220 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
2f230 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2f240 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74 65  FUNC.void sqlite
2f250 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28 42  3BtreeSkipNext(B
2f260 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f270 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65 20    /* We believe 
2f280 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2f290 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 69  must always be i
2f2a0 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61 74  n the valid stat
2f2b0 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73  e when.  ** this
2f2c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f2d0 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f 6f  ed, but the proo
2f2e0 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c 20  f is difficult, 
2f2f0 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20 2a  so we add an.  *
2f300 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74 20  * ALWaYS() test 
2f310 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65 20  just in case we 
2f320 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20 20  are wrong. */.  
2f330 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
2f340 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f350 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 43  VALID) ){.    pC
2f360 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f370 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
2f380 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f390 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
2f3a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f3b0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
2f3c0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2f3d0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
2f3e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2f3f0 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2f400 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2f410 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2f420 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2f430 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2f440 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2f450 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2f460 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2f470 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2f480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2f490 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2f4a0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2f4b0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2f4c0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f4d0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2f4f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2f500 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2f510 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2f520 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2f530 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2f540 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2f550 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2f560 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2f570 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2f580 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2f590 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2f5a0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2f5b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2f5c0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2f5d0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2f5e0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2f5f0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2f600 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2f610 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2f620 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2f630 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2f640 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2f650 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2f660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2f670 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2f680 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2f690 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2f6a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2f6b0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==pCur
2f6c0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  ->pPage->nCell-1
2f6d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f6e0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
2f6f0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2f700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f710 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2f720 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2f730 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f740 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2f750 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2f760 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f770 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2f780 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2f790 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2f7a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f7b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2f7c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2f7d0 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
2f7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2f7f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2f800 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2f810 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2f820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2f830 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2f840 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2f850 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2f860 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2f870 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2f880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f890 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f8a0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2f8b0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
2f8c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
2f8d0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
2f8e0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
2f8f0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
2f900 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
2f910 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
2f920 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
2f930 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
2f940 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
2f950 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
2f960 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
2f970 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
2f980 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
2f990 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
2f9a0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
2f9b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
2f9c0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
2f9d0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
2f9e0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
2f9f0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
2fa00 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
2fa10 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
2fa20 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
2fa30 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
2fa40 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
2fa50 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
2fa60 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
2fa70 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
2fa80 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
2fa90 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
2faa0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2fab0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
2fac0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
2fad0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
2fae0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
2faf0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
2fb00 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
2fb10 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
2fb20 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2fb30 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2fb40 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
2fb50 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
2fb60 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
2fb70 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2fb80 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2fb90 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2fbb0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
2fbc0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
2fbd0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2fbe0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
2fbf0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
2fc00 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
2fc10 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
2fc20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
2fc30 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
2fc40 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2fc50 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2fc60 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2fc70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2fc80 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
2fc90 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
2fca0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
2fcb0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
2fcc0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2fcd0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2fce0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
2fd00 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
2fd10 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2fd20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2fd30 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e  s, the pIdxKey->
2fd40 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20  eqSeen field is 
2fd50 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72  set to 1 if ther
2fd60 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65  e.** exists an e
2fd70 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2fd80 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d  e that exactly m
2fd90 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20  atches pIdxKey. 
2fda0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2fdb0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
2fdc0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2fdd0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2fde0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2fdf0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2fe00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2fe10 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2fe20 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2fe30 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fe50 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2fe60 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2fe70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2fe80 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2fe90 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2fea0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2feb0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2fec0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2fed0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2fee0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2fef0 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2ff00 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2ff10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2ff20 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ff30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ff40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ff50 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2ff60 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2ff70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2ff80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2ff90 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2ffa0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
2ffb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ffc0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ffd0 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78  R_VALID || (pIdx
2ffe0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2fff0 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b  curIntKey!=0) );
30000 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
30010 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
30020 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
30030 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
30040 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
30050 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
30060 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
30070 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
30080 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d  /.  if( pIdxKey=
30090 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65  =0.   && pCur->e
300a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
300b0 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
300c0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
300d0 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b  lidNKey)!=0.  ){
300e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
300f0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
30100 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
30110 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
30120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
30130 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
30140 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
30150 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
30160 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30170 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
30180 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
30190 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  s = -1;.        
301a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
301b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
301c0 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
301d0 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d  ted key is one m
301e0 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65  ore than the pre
301f0 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a  vious key, then.
30200 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20        ** try to 
30210 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20  get there using 
30220 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
30230 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  () rather than a
30240 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62   full.      ** b
30250 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54  inary search.  T
30260 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
30270 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68  zation only.  Th
30280 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
30290 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
302a0 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  ll obtained with
302b0 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f  out this case, o
302c0 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
302d0 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
302e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
302f0 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
30300 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e   && !pCur->skipN
30310 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ext ){.        *
30320 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
30330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30340 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29  reeNext(pCur, 0)
30350 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30370 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c           getCell
30380 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
30390 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
303a0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
303b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
303c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
303d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
303e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
303f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
30400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
30410 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30430 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
30460 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
30470 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
30480 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
30490 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
304a0 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
304b0 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
304c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
304d0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
304e0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
304f0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
30500 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
30510 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
30520 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
30530 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30540 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
30550 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
30560 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
30570 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
30580 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
30590 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
305a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
305b0 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  TY ){.      asse
305c0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
305d0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
305e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
305f0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
30600 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
30610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30620 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
30630 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
30640 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
30650 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
30660 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
30670 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
30680 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
30690 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
306a0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
306b0 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73  ell > 0 );.  ass
306c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
306d0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
306e0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
306f0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
30700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
30710 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
30720 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
30730 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
30740 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
30750 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
30760 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
30770 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
30780 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  e;.    u8 *pCell
30790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
307a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
307b0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
307c0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
307d0 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
307e0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
307f0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
30800 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
30810 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
30820 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
30830 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
30840 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
30850 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
30860 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
30870 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
30880 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
30890 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
308a0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
308b0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
308c0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
308d0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
308e0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
308f0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
30900 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
30910 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
30920 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
30930 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
30940 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
30950 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
30960 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
30970 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
30980 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
30990 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
309a0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
309b0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
309c0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
309d0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
309e0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
309f0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
30a00 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
30a10 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
30a20 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
30a30 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
30a40 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
30a50 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
30a60 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
30a70 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
30a80 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
30a90 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
30aa0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
30ab0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
30ac0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
30ad0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
30ae0 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
30af0 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
30b00 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
30b10 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
30b20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
30b30 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
30b40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
30b50 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
30b60 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  taEnd ){.       
30b70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30b80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
30b90 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
30ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30bc0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
30bd0 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
30be0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
30bf0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
30c00 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
30c10 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
30c20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
30c30 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20  >upr ){ c = -1; 
30c40 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
30c50 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
30c60 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key>intKey ){.  
30c70 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
30c80 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x-1;.          i
30c90 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
30ca0 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = +1; break; }. 
30cb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30cc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30cd0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
30ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   );.          pC
30cf0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
30d00 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
30d10 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
30d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
30d30 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
30d40 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
30d50 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
30d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30d70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
30d80 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
30d90 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
30da0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
30db0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
30dc0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
30dd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
30de0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
30df0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
30e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30e10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30e30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30e40 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
30e50 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
30e60 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
30e70 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
30e80 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
30e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
30ea0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
30eb0 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
30ec0 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
30ed0 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
30ee0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
30ef0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
30f00 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
30f10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
30f20 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
30f30 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
30f40 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
30f50 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
30f60 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
30f70 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
30f80 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
30f90 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
30fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
30fb0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
30fc0 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
30fd0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
30fe0 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
30ff0 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
31000 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
31010 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
31020 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
31030 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31040 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
31050 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
31060 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
31070 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
31080 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
31090 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
310a0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
310b0 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
310c0 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
310d0 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
310e0 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
310f0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
31100 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
31110 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
31120 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
31130 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
31140 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
31150 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
31160 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
31170 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
31180 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
31190 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
311a0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
311b0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
311c0 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
311d0 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
311e0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
311f0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
31200 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
31210 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
31220 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
31230 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
31240 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
31250 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
31260 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
31270 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
31280 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
31290 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
312a0 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
312b0 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
312c0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
312d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
312e0 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
312f0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
31300 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
31310 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
31320 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
31330 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
31340 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
31350 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31360 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
31370 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
31380 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
31390 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
313a0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
313b0 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
313c0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
313d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
313e0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
313f0 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
31400 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
31410 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
31420 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
31430 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
31440 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
31450 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
31460 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
31470 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
31480 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
31490 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
314a0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
314b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
314c0 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
314d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
314e0 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
314f0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
31500 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31510 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
31520 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
31530 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
31540 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
31550 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
31560 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
31570 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
31580 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
31590 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
315a0 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
315b0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
315c0 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
315d0 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
315e0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
315f0 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
31600 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
31610 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
31620 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
31630 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
31640 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
31650 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
31660 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
31670 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
31680 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
31690 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
316a0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
316b0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
316c0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
316d0 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
316e0 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
316f0 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
31700 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31710 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
31720 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
31730 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
31740 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
31750 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
31760 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
31770 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
31780 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
31790 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
317a0 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
317b0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
317c0 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
317d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
317e0 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20  ( nCell<2 ){.   
317f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31800 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
31810 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
31820 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
31830 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
31840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31850 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
31860 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
31870 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
31880 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
31890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
318a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
318b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
318c0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
318d0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
318e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
318f0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
31900 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31910 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
31920 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
31930 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
31940 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
31950 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
31960 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56  Flags &= ~BTCF_V
31970 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
31980 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
319a0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
319b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
319c0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
319d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
319e0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
319f0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
31a00 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
31a10 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
31a20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
31a30 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
31a40 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
31a50 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
31a60 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
31a70 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
31a80 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
31a90 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
31aa0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
31ab0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
31ac0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
31ad0 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
31ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31af0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
31b00 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
31b10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31b20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
31b30 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
31b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31b50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
31b60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
31b70 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
31b80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31b90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31ba0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
31bb0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
31bc0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
31bd0 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
31be0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31bf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
31c00 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
31c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31c20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
31c30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
31c40 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
31c50 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
31c60 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
31c70 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
31c80 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
31c90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
31ca0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
31cb0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
31cc0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
31cd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31ce0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
31cf0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
31d00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
31d10 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
31d20 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
31d30 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
31d40 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
31d50 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
31d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31d70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
31d80 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
31d90 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
31da0 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
31db0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
31dc0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
31dd0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
31de0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31df0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31e10 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
31e20 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
31e30 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
31e40 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  }.    pCur->ix =
31e50 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
31e60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
31e70 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
31e80 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
31e90 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
31ea0 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
31eb0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
31ec0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
31ed0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
31ee0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
31ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31f00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
31f10 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
31f20 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
31f30 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
31f40 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
31f50 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
31f60 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
31f70 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
31f80 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
31f90 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
31fa0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
31fb0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
31fc0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
31fd0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
31fe0 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
31ff0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
32000 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
32010 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
32020 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
32030 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
32040 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
32050 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
32060 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
32070 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
32080 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
32090 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
320a0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
320b0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
320c0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
320d0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
320e0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
320f0 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
32100 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
32110 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
32120 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
32130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
32140 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74  n estimate for t
32150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
32160 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
32170 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70  hat pCur is.** p
32180 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74  ointing to.  Ret
32190 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
321a0 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69  umber if no esti
321b0 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c  mate is currentl
321c0 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  y .** available.
321d0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
321e0 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28  treeRowCountEst(
321f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
32200 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69  .  i64 n;.  u8 i
32210 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
32220 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
32230 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
32240 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32250 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
32260 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
32270 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  ;..  /* Currentl
32280 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65  y this interface
32290 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
322a0 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c  by the OP_IfSmal
322b0 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c  ler.  ** opcode,
322c0 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73   and it that cas
322d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  e the cursor wil
322e0 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69  l always be vali
322f0 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  d and.  ** will 
32300 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20  always point to 
32310 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a  a leaf node. */.
32320 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
32330 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
32340 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e  _VALID) ) return
32350 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   -1;.  if( NEVER
32360 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65  (pCur->pPage->le
32370 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  af==0) ) return 
32380 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d  -1;..  n = pCur-
32390 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  >pPage->nCell;. 
323a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72   for(i=0; i<pCur
323b0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
323c0 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70     n *= pCur->ap
323d0 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a  Page[i]->nCell;.
323e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
323f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
32400 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
32410 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
32420 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
32430 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a  ** Return value:
32440 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
32450 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65  _OK        succe
32460 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ss.**    SQLITE_
32470 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72  DONE      cursor
32480 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
32490 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74  ting at the last
324a0 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f   element.**    o
324b0 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20  therwise        
324c0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
324d0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
324e0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
324f0 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
32500 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
32510 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
32520 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
32530 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
32540 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
32550 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
32560 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
32570 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
32580 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
32590 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
325a0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
325b0 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
325c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
325d0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
325e0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
325f0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
32600 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
32610 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
32620 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
32630 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
32640 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  rgument in sqlit
32650 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29  e3BtreeNext(C,F)
32660 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a   is 1, then the.
32670 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  ** cursor corres
32680 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
32690 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
326a0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
326b0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
326c0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
326d0 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
326e0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
326f0 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69   F argument.** i
32700 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
32710 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69  implement.  SQLi
32720 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
32730 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
32740 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e   use.** this hin
32750 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f  t, but COMDB2 do
32760 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  es..*/.static SQ
32770 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
32780 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
32790 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
327a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
327b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
327c0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
327d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
327e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
327f0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
32800 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
32810 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
32820 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
32830 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
32840 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
32850 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
32860 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
32870 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
32880 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
32890 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
328a0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
328b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
328c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
328d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
328e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
328f0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
32900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32910 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
32920 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
32930 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
32940 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
32950 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
32960 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
32970 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
32980 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
32990 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
329a0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
329b0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
329c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
329d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
329e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
329f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
32a00 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
32a10 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
32a20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
32a30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
32a40 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
32a50 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ix;.  if( !pPage
32a60 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
32a70 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77  /* The only know
32a80 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73 20 74  n way for this t
32a90 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f 72 20  o happen is for 
32aa0 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a 20 20  there to be a.  
32ab0 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 53    ** recursive S
32ac0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  QL function that
32ad0 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45 20 6f   does a DELETE o
32ae0 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61 72 74  peration as part
32af0 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53 45 4c   of a.    ** SEL
32b00 45 43 54 20 77 68 69 63 68 20 64 65 6c 65 74 65  ECT which delete
32b10 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 66 72  s content out fr
32b20 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63 74 69  om under an acti
32b30 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  ve cursor.    **
32b40 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
32b50 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 72  tabase file wher
32b60 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
32b70 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72 6f 6d  g DELETE-ed from
32b80 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61 67 65  .    ** has page
32b90 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68  s in common with
32ba0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
32bb0 20 71 75 65 72 69 65 64 2e 20 20 53 65 65 20 54   queried.  See T
32bc0 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65  H3.    ** module
32bd0 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e 74 65   cov1/btree78.te
32be0 73 74 20 74 65 73 74 63 61 73 65 20 32 32 30 20  st testcase 220 
32bf0 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66 6f 72  (2018-06-08) for
32c00 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61 6d 70   an.    ** examp
32c10 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  le. */.    retur
32c20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
32c30 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
32c40 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32c50 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
32c60 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
32c70 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
32c80 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
32c90 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
32ca0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
32cb0 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
32cc0 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
32cd0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
32ce0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
32cf0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
32d00 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
32d10 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
32d20 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
32d30 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
32d40 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
32d50 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
32d60 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
32d70 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
32d80 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
32d90 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
32da0 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
32db0 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
32dc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
32dd0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
32de0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
32df0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
32e00 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
32e10 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
32e20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
32e30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32e50 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
32e60 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
32e70 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
32e80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
32e90 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
32ea0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
32eb0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
32ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
32ed0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
32ee0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
32ef0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
32f00 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
32f10 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68  ->pPage;.    }wh
32f20 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
32f30 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
32f40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
32f50 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
32f60 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
32f70 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
32f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32fa0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
32fb0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
32fc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
32fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
32ff0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
33000 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
33010 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
33020 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
33030 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61   flags){.  MemPa
33040 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55  ge *pPage;.  UNU
33050 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66  SED_PARAMETER( f
33060 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64  lags );  /* Used
33070 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e   in COMDB2 but n
33080 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  ot native SQLite
33090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75   */.  assert( cu
330a0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
330b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
330c0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
330d0 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73  flags==1 );.  as
330e0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
330f0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
33100 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
33110 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
33120 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
33130 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
33140 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
33150 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
33160 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
33170 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
33180 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
33190 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
331a0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
331b0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28  ->pPage;.  if( (
331c0 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61  ++pCur->ix)>=pPa
331d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
331e0 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
331f0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
33200 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69  t(pCur);.  }.  i
33210 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
33220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33230 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
33240 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
33250 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
33260 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
33270 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
33280 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
33290 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
332a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
332b0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  ..** Return valu
332c0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  es:.**.**     SQ
332d0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63  LITE_OK     succ
332e0 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ess.**     SQLIT
332f0 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72  E_DONE   the cur
33300 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
33310 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  n the first elem
33320 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
33330 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73  .**     otherwis
33340 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
33350 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
33360 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
33370 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
33380 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
33390 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
333a0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
333b0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
333c0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
333d0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
333e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
333f0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
33400 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
33410 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
33420 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
33430 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
33440 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
33450 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
33460 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
33470 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
33480 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
33490 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
334a0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
334b0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
334c0 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
334d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
334e0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
334f0 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  s(C,F) is 1, the
33500 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  n.** the cursor 
33510 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
33520 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
33530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
33540 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
33550 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
33560 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
33570 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
33580 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
33590 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74  t is a.** hint t
335a0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
335b0 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c    The native SQL
335c0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
335d0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
335e0 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69  t.** use this hi
335f0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
33600 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
33610 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
33620 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
33630 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
33640 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
33650 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
33660 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
33670 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
33680 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
33690 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
336a0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
336b0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
336c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
336d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
336e0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
336f0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
33700 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
33710 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
33720 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
33730 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
33740 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
33750 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
33760 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
33770 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
33780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33790 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
337a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
337b0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
337c0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
337d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
337e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
337f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
33800 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
33810 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
33820 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
33830 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
33840 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
33850 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
33860 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
33870 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
33880 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
33890 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
338a0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
338b0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
338c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
338d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
338e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
338f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
33900 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
33910 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
33920 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
33930 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
33940 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
33950 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  dx = pCur->ix;. 
33960 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
33970 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
33980 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
33990 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
339a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
339b0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
339c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
339d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
339e0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d  while( pCur->ix=
339f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
33a00 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
33a10 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
33a20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
33a30 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
33a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
33a50 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
33a60 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
33a70 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
33a80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
33a90 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
33aa0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
33ab0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
33ac0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
33ad0 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
33ae0 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  >ix--;.    pPage
33af0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
33b00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
33b10 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
33b20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
33b30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
33b40 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30  Previous(pCur, 0
33b50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33b60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
33b70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
33b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
33b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
33ba0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
33bb0 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29  pCur, int flags)
33bc0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
33bd0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
33be0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
33bf0 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
33c00 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ags==1 );.  asse
33c10 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
33c20 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
33c30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
33c40 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  LID );.  UNUSED_
33c50 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
33c60 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
33c70 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
33c80 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
33c90 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
33ca0 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
33cb0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
33cc0 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
33cd0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
33ce0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
33cf0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
33d00 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
33d10 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20   pCur->ix==0.   
33d20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  || pCur->pPage->
33d30 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  leaf==0.  ){.   
33d40 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65   return btreePre
33d50 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d  vious(pCur);.  }
33d60 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20  .  pCur->ix--;. 
33d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33d80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
33d90 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
33da0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33db0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
33dc0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
33dd0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
33de0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
33df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33e00 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
33e10 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
33e20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
33e30 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
33e40 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
33e50 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
33e60 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
33e70 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
33e80 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
33e90 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
33ea0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
33eb0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
33ec0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
33ed0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
33ee0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
33ef0 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
33f00 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
33f10 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
33f20 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
33f30 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65   NULL in the eve
33f40 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
33f50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
33f60 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
33f70 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
33f80 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
33f90 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
33fa0 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
33fb0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
33fc0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
33fd0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
33fe0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
33ff0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
34000 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
34010 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
34020 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
34030 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
34040 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
34050 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
34060 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
34070 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
34080 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
34090 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
340a0 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
340b0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
340c0 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
340d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
340e0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
340f0 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
34100 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
34110 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
34120 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
34130 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
34140 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
34150 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
34160 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
34170 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
34180 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
34190 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
341a0 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
341b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
341c0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
341d0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
341e0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
341f0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
34200 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
34210 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
34220 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
34230 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
34240 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
34250 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
34260 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
34270 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
34280 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
34290 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
342a0 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
342b0 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
342c0 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
342d0 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
342e0 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
342f0 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
34300 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
34310 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
34320 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
34330 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34340 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
34350 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
34360 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
34370 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
34380 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
34390 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
343a0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
343b0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
343c0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
343d0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
343e0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
343f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34400 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
34410 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34420 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
34430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
34440 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
34450 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
34460 20 52 45 51 55 49 52 45 5f 50 54 52 4d 41 50 20   REQUIRE_PTRMAP 
34470 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
34480 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
34490 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
344a0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
344b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
344c0 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
344d0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
344e0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
344f0 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
34500 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
34510 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
34520 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
34530 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
34540 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
34550 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
34560 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
34570 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 49 53  ge-1 );.  if( IS
34580 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 26 26  CONCURRENT==0 &&
34590 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
345a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
345b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
345c0 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 70  }..  /* Ensure p
345d0 61 67 65 20 31 20 69 73 20 77 72 69 74 61 62 6c  age 1 is writabl
345e0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
345f0 20 77 69 6c 6c 20 65 69 74 68 65 72 20 63 68 61   will either cha
34600 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  nge the number. 
34610 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 69 6e 20   ** of pages in 
34620 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 72  the free-list or
34630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
34640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34650 53 69 6e 63 65 20 62 6f 74 68 0a 20 20 2a 2a 20  Since both.  ** 
34660 6f 66 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  of these operati
34670 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d 6f 64 69  ons involve modi
34680 66 79 69 6e 67 20 70 61 67 65 20 31 20 68 65 61  fying page 1 hea
34690 64 65 72 20 66 69 65 6c 64 73 2c 20 70 61 67 65  der fields, page
346a0 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20 64 65 66   1.  ** will def
346b0 69 6e 69 74 65 6c 79 20 62 65 20 77 72 69 74 74  initely be writt
346c0 65 6e 20 62 79 20 74 68 69 73 20 74 72 61 6e 73  en by this trans
346d0 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  action. If this 
346e0 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e 54  is an CONCURRENT
346f0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
34700 6e 2c 20 65 6e 73 75 72 65 20 74 68 65 20 42 74  n, ensure the Bt
34710 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63 74  reePtrmap struct
34720 75 72 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ure has been all
34730 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 72 63  ocated.  */.  rc
34740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34750 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
34760 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
34770 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34780 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
34790 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
347a0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
347b0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
347c0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
347d0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
347e0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
347f0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
34800 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
34810 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
34820 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
34830 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
34840 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
34850 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
34860 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
34870 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
34880 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
34890 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
348a0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
348b0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
348c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
348d0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
348e0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
348f0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
34900 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
34910 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
34920 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
34930 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
34940 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
34950 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
34960 20 61 73 73 65 72 74 28 20 49 53 41 55 54 4f 56   assert( ISAUTOV
34970 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43 55 52 52  ACUUM!=ISCONCURR
34980 45 4e 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ENT );.      if(
34990 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
349a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
349b0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
349c0 20 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70           u8 eTyp
349d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e;.          ass
349e0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
349f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
34a00 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
34a10 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  um );.          
34a20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
34a30 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
34a40 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
34a50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
34a60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
34a70 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
34a80 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
34a90 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
34aa0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
34ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
34ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34ad0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
34ae0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
34af0 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
34b00 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
34b10 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
34b20 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
34b30 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
34b40 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
34b50 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
34b60 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
34b70 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
34b80 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
34b90 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
34ba0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
34bb0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
34bc0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
34bd0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
34be0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
34bf0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
34c00 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
34c10 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
34c20 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
34c30 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
34c40 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
34c50 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
34c60 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
34c70 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
34c80 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
34c90 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
34ca0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
34cb0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
34cc0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
34cd0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
34ce0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
34cf0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
34d00 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
34d10 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
34d20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
34d30 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
34d40 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
34d50 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
34d60 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
34d70 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
34d80 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
34d90 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34da0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
34db0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
34dc0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
34dd0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
34de0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
34df0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
34e00 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
34e10 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
34e20 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
34e30 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
34e40 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
34e50 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
34e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
34e80 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
34e90 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
34ea0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
34eb0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
34ec0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
34ed0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
34ee0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
34ef0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
34f00 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
34f10 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
34f20 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
34f30 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
34f40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
34f50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
34f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
34f70 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
34f80 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
34f90 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
34fa0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
34fb0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
34fc0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34fd0 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b  _PGNO(pPrevTrunk
34fe0 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70   ? pPrevTrunk->p
34ff0 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20 20  gno : 1);.      
35000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
35010 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
35020 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
35030 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
35040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
35060 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
35070 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
35080 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
35090 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
350a0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
350b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
350c0 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
350d0 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
350e0 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
350f0 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
35100 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
35110 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
35120 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
35130 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
35140 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
35150 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
35160 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
35170 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
35180 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
35190 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
351a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
351b0 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
351c0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
351d0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
351e0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
351f0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
35200 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
35210 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
35220 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
35230 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
35240 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
35250 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
35260 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
35270 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35280 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35290 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
352a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
352b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
352c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
352d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
352e0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
352f0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
35300 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
35310 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
35320 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
35330 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
35340 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
35350 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
35360 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
35370 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
35380 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
35390 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
353a0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
353b0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
353c0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
353d0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
353e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
353f0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
35400 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
35410 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
35420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35430 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
35440 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  unk);.        go
35450 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
35460 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
35470 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35480 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
35490 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
354a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
354b0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
354c0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
354d0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
354e0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
354f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
35500 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
35510 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
35520 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
35530 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
35540 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
35550 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
35560 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
35570 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
35580 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
35590 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
355a0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
355b0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
355c0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
355d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
355e0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
355f0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
35600 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
35610 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35620 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
35630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35640 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
35650 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
35660 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
35670 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
35680 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
35690 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
356a0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
356b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
356c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
356d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
356e0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
356f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
35720 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
35730 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
35740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35750 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
35760 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
35770 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
35780 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
35790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
357a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
357b0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
357c0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
357d0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
357e0 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
357f0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
35800 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
35810 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
35820 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
35830 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
35840 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
35850 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
35860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
35870 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
35880 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
35890 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
358a0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
358b0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
358c0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
358d0 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
358e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
358f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
35900 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
35910 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
35920 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
35930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
35950 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
35960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
35970 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
35980 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
35990 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
359a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
359b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
359c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
359d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
359e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
359f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
35a00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35a10 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
35a20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
35a30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35a50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35a60 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
35a70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
35a80 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
35a90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35aa0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
35ab0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
35ac0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
35ad0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
35ae0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
35af0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
35b00 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
35b10 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
35b20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
35b30 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
35b40 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
35b50 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
35b60 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
35b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
35b80 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
35b90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
35ba0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
35bb0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
35bc0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35bd0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
35be0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35bf0 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
35c00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
35c10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35c20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35c30 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
35c40 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
35c50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
35c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
35c70 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
35c80 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
35c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35ca0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
35cb0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
35cc0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
35cd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
35cf0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
35d00 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
35d10 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
35d20 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
35d30 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
35d40 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
35d50 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
35d60 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
35d70 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
35d80 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
35d90 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
35da0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
35db0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
35dc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
35dd0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
35de0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
35df0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
35e00 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
35e10 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
35e20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
35e30 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
35e40 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
35e50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
35e60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35e70 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
35e80 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
35e90 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
35ea0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
35eb0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
35ec0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
35ed0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
35ee0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35ef0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35f00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35f10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35f20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
35f30 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
35f40 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
35f50 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
35f60 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
35f70 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
35f80 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
35f90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
35fa0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
35fb0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
35fc0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
35fd0 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
35ff0 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
36000 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
36010 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
36020 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
36030 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
36040 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
36050 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
36060 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36070 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
36080 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
36090 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
360a0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
360b0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
360c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
360d0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
360e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
360f0 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
36100 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
36110 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
36120 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
36130 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
36140 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
36150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
36160 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
36170 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
36180 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
36190 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
361a0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
361b0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
361c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
361d0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
361e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
361f0 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
36200 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
36210 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
36220 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
36230 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
36240 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
36250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36260 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
36270 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
36280 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
36290 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
362a0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
362b0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
362c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
362d0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
362e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
362f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
36300 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
36310 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
36320 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
36330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
36340 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
36350 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
36360 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
36370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36380 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
36390 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
363a0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
363b0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
363c0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
363d0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
363e0 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
363f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
36400 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
36410 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
36420 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
36430 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
36440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36450 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
36460 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36470 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
36480 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
36490 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
364a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
364b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
364c0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
364d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
364e0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
364f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36500 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
36510 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
36520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36530 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36540 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
36550 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
36560 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
36570 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
36580 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
36590 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
365a0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
365b0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
365c0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
365d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
365e0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
365f0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
36600 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
36610 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
36620 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
36630 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
36640 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
36650 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
36660 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
36670 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
36680 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
36690 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
366a0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
366b0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
366c0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
366d0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
366e0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
366f0 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
36700 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
36710 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
36720 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
36730 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
36740 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
36750 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
36760 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
36770 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
36780 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
36790 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
367a0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
367b0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
367c0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
367d0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
367e0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
367f0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
36800 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
36810 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
36820 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
36830 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
36840 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
36850 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
36860 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
36870 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
36880 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
36890 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
368a0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
368b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
368c0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
368d0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
368e0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
368f0 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
36900 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
36910 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
36920 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
36930 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
36940 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
36950 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
36960 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
36970 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
36980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36990 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
369a0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
369b0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
369c0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
369d0 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
369e0 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
369f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36a00 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
36a10 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
36a20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36a30 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
36a40 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
36a50 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
36a60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
36a70 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
36a80 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
36a90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36aa0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
36ab0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
36ac0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
36ad0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
36ae0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
36af0 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
36b00 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
36b10 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
36b20 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
36b30 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
36b40 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
36b50 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
36b60 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
36b70 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
36b80 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
36b90 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
36ba0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
36bb0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
36bc0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
36bd0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
36be0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
36bf0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
36c00 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
36c10 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
36c20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
36c30 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
36c40 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
36c50 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
36c60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
36c70 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
36c80 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
36c90 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
36ca0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
36cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36cc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36cd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36ce0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
36cf0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
36d00 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
36d10 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
36d20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
36d30 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
36d40 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
36d50 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
36d60 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
36d70 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
36d80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
36d90 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
36da0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
36db0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
36dc0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
36dd0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
36de0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
36df0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36e00 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
36e10 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
36e20 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
36e30 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
36e40 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
36e50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
36e60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36e70 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
36e80 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
36e90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
36eb0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
36ec0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
36ed0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
36ee0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
36ef0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
36f00 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
36f10 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
36f20 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
36f30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36f40 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
36f50 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
36f60 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
36f70 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
36f80 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
36f90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36fa0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
36fb0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
36fc0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
36fd0 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
36fe0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36ff0 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
37000 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
37010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37020 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37030 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
37040 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
37050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37060 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
37070 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
37080 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
37090 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
370a0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
370b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
370c0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
370d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
370e0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
370f0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
37100 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
37110 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
37120 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37130 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
37140 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
37150 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
37160 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
37170 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
37180 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
37190 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
371a0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
371b0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
371c0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
371d0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
371e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
371f0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
37200 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
37210 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
37220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
37230 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
37240 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
37250 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
37260 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
37270 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
37280 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
37290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
372a0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
372b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
372c0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
372d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
372e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
372f0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
37300 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
37310 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
37320 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
37330 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
37340 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
37350 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
37380 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
37390 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
373a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
373b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
373c0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
373d0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
373e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
37400 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
37410 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
37420 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
37430 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
37440 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
37450 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37460 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
37470 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
37480 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
37490 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
374a0 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
374b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
374c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
374d0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
374e0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
374f0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
37500 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
37510 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
37520 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
37530 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
37540 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
37550 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
37560 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
37570 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
37580 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
37590 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
375a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
375b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
375c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
375d0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
375e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
375f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
37600 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
37610 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
37620 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
37630 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
37640 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
37650 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
37660 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
37670 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
37680 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
37690 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
376a0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
376b0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
376c0 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
376d0 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
376e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
376f0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
37700 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
37710 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
37720 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37730 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
37740 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
37750 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
37760 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
37770 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
37780 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
37790 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
377a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
377b0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
377c0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
377d0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
377e0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
377f0 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
37800 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
37810 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
37820 20 69 66 28 20 52 45 51 55 49 52 45 5f 50 54 52   if( REQUIRE_PTR
37830 4d 41 50 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  MAP ){.    ptrma
37840 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
37850 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
37860 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
37870 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
37880 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
37890 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
378a0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
378b0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
378c0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
378d0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
378e0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
378f0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
37900 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
37910 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
37920 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
37930 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
37940 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
37950 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
37960 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
37970 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
37980 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
37990 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
379a0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
379b0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
379c0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
379d0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
379e0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
379f0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
37a00 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
37a10 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
37a20 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
37a30 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
37a40 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
37a50 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
37a60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
37a70 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
37a80 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
37a90 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
37aa0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
37ab0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
37ac0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
37ad0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37ae0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
37af0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
37b00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37b10 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
37b20 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
37b30 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
37b40 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
37b50 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
37b60 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
37b70 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
37b80 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
37b90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
37ba0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
37bb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37bc0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
37bd0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
37be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
37bf0 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
37c00 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
37c10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
37c20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
37c30 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
37c40 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
37c50 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
37c60 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
37c70 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
37c80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37c90 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
37ca0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
37cb0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
37cc0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
37cd0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
37ce0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
37cf0 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
37d00 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
37d10 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
37d20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
37d30 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
37d40 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
37d50 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
37d60 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
37d70 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
37d80 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
37d90 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
37da0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
37db0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
37dc0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
37dd0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
37de0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
37df0 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
37e00 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
37e10 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
37e20 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
37e30 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
37e40 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
37e50 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
37e60 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
37e70 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
37e80 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
37e90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
37ea0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
37eb0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
37ec0 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
37ed0 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
37ee0 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
37ef0 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
37f00 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
37f10 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
37f20 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
37f30 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
37f40 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
37f50 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
37f60 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
37f70 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
37f80 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
37f90 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
37fa0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
37fb0 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
37fc0 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
37fd0 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
37fe0 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
37ff0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
38000 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
38010 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
38020 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
38030 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
38040 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
38050 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
38060 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
38070 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
38080 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
38090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
380a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
380b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
380c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
380d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
380e0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
380f0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
38100 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
38110 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
38120 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
38130 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
38140 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
38150 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
38160 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
38170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
38180 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
38190 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
381a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
381b0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
381c0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
381d0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
381e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
381f0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
38200 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
38210 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
38220 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
38230 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
38240 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
38250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
38260 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
38270 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
38280 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
38290 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
382a0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
382b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
382c0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
382d0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
382e0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
382f0 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
38300 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
38310 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
38320 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
38330 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
38340 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
38350 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
38360 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
38370 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
38380 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
38390 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
383a0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
383b0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
383c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
383d0 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
383e0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
383f0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
38400 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
38410 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
38420 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
38430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
38440 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
38450 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
38460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38470 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
38480 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
38490 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
384a0 2c 20 69 54 72 75