/ Hex Artifact Content
Login

Artifact ffb001f02b4c65984068e50cbb308bb833c3d4d6280bf606e43d3eebf8d740df:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
3a80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
3a90: 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ENT./*.** The fo
3aa0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ab0: 65 20 2d 20 42 74 72 65 65 50 74 72 6d 61 70 20  e - BtreePtrmap 
3ac0: 2d 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 2d  - stores the in-
3ad0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 6d  memory pointer m
3ae0: 61 70 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 6e  ap.** used for n
3af0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
3b00: 61 67 65 73 20 69 6e 20 43 4f 4e 43 55 52 52 45  ages in CONCURRE
3b10: 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  NT transactions.
3b20: 20 53 75 63 68 20 70 61 67 65 73 20 61 72 65 0a   Such pages are.
3b30: 2a 2a 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61  ** always alloca
3b40: 74 65 64 20 69 6e 20 61 20 63 6f 6e 74 69 67 75  ted in a contigu
3b50: 6f 75 73 20 62 6c 6f 63 6b 20 28 66 72 6f 6d 20  ous block (from 
3b60: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
3b70: 69 6c 65 29 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile) starting.**
3b80: 20 77 69 74 68 20 70 61 67 65 20 42 74 72 65 65   with page Btree
3b90: 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2e 0a 2a  Ptrmap.iFirst..*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 52   RollbackEntry R
3bc0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 3b 0a 74 79  ollbackEntry;.ty
3bd0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 74 72  pedef struct Ptr
3be0: 6d 61 70 45 6e 74 72 79 20 50 74 72 6d 61 70 45  mapEntry PtrmapE
3bf0: 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 50 74 72  ntry;.struct Ptr
3c00: 6d 61 70 45 6e 74 72 79 20 7b 0a 20 20 50 67 6e  mapEntry {.  Pgn
3c10: 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38 20 65  o parent;.  u8 e
3c20: 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63 74 20  Type;.};.struct 
3c30: 52 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 7b 0a  RollbackEntry {.
3c40: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 50    Pgno pgno;.  P
3c50: 67 6e 6f 20 70 61 72 65 6e 74 3b 0a 20 20 75 38  gno parent;.  u8
3c60: 20 65 54 79 70 65 3b 0a 7d 3b 0a 73 74 72 75 63   eType;.};.struc
3c70: 74 20 42 74 72 65 65 50 74 72 6d 61 70 20 7b 0a  t BtreePtrmap {.
3c80: 20 20 50 67 6e 6f 20 69 46 69 72 73 74 3b 20 20    Pgno iFirst;  
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ca0: 20 20 2f 2a 20 46 69 72 73 74 20 6e 65 77 20 70    /* First new p
3cb0: 61 67 65 20 6e 75 6d 62 65 72 20 61 50 74 72 5b  age number aPtr[
3cc0: 30 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 74  0] */..  int nPt
3cd0: 72 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  rAlloc;         
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3cf0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 50  cated size of aP
3d00: 74 72 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  tr[] array */.  
3d10: 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 61 50 74  PtrmapEntry *aPt
3d20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3d30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 70 61 72 65  /* Array of pare
3d40: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  nt page numbers 
3d50: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 76 70 74 3b  */..  int nSvpt;
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 69        /* Used si
3d80: 7a 65 20 6f 66 20 61 53 76 70 74 5b 5d 20 61 72  ze of aSvpt[] ar
3d90: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 76  ray */.  int nSv
3da0: 70 74 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  ptAlloc;        
3db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
3dc0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 53  cated size of aS
3dd0: 76 70 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 2a  vpt[] */.  int *
3de0: 61 53 76 70 74 3b 20 20 20 20 20 20 20 20 20 20  aSvpt;          
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3e00: 72 73 74 20 61 52 6f 6c 6c 62 61 63 6b 5b 5d 20  rst aRollback[] 
3e10: 65 6e 74 72 79 20 66 6f 72 20 73 61 76 65 70 6f  entry for savepo
3e20: 69 6e 74 20 69 20 2a 2f 0a 0a 20 20 69 6e 74 20  int i */..  int 
3e30: 6e 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  nRollback;      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3e50: 73 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 6c  sed size of aRol
3e60: 6c 62 61 63 6b 5b 5d 20 61 72 72 61 79 20 2a 2f  lback[] array */
3e70: 0a 20 20 69 6e 74 20 6e 52 6f 6c 6c 62 61 63 6b  .  int nRollback
3e80: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
3e90: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3ea0: 73 69 7a 65 20 6f 66 20 61 52 6f 6c 6c 62 61 63  size of aRollbac
3eb0: 6b 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 52  k[] array */.  R
3ec0: 6f 6c 6c 62 61 63 6b 45 6e 74 72 79 20 2a 61 52  ollbackEntry *aR
3ed0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 2f  ollback;       /
3ee0: 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6c 6c 62  * Array of rollb
3ef0: 61 63 6b 20 65 6e 74 72 69 65 73 20 2a 2f 0a 7d  ack entries */.}
3f00: 3b 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  ;../* !defined(S
3f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
3f20: 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 49 66 20  RRENT).**.** If 
3f30: 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
3f40: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
3f50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 42 74 72   or equal to Btr
3f60: 65 65 50 74 72 6d 61 70 2e 69 46 69 72 73 74 2c  eePtrmap.iFirst,
3f70: 20 0a 2a 2a 20 73 74 6f 72 65 20 61 6e 20 65 6e   .** store an en
3f80: 74 72 79 20 66 6f 72 20 69 74 20 69 6e 20 74 68  try for it in th
3f90: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 74  e pointer-map st
3fa0: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
3fb0: 69 63 20 69 6e 74 20 62 74 72 65 65 50 74 72 6d  ic int btreePtrm
3fc0: 61 70 53 74 6f 72 65 28 0a 20 20 42 74 53 68 61  apStore(.  BtSha
3fd0: 72 65 64 20 2a 70 42 74 2c 0a 20 20 50 67 6e 6f  red *pBt,.  Pgno
3fe0: 20 70 67 6e 6f 2c 0a 20 20 75 38 20 65 54 79 70   pgno,.  u8 eTyp
3ff0: 65 2c 20 0a 20 20 50 67 6e 6f 20 70 61 72 65 6e  e, .  Pgno paren
4000: 74 0a 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d  t.){.  BtreePtrm
4010: 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e  ap *pMap = pBt->
4020: 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 67 6e 6f  pMap;.  if( pgno
4030: 3e 3d 70 4d 61 70 2d 3e 69 46 69 72 73 74 20 29  >=pMap->iFirst )
4040: 7b 0a 20 20 20 20 69 6e 74 20 69 45 6e 74 72 79  {.    int iEntry
4050: 20 3d 20 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e   = pgno - pMap->
4060: 69 46 69 72 73 74 3b 0a 0a 20 20 20 20 2f 2a 20  iFirst;..    /* 
4070: 47 72 6f 77 20 74 68 65 20 61 50 74 72 5b 5d 20  Grow the aPtr[] 
4080: 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65  array as require
4090: 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
40a0: 69 45 6e 74 72 79 3e 3d 70 4d 61 70 2d 3e 6e 50  iEntry>=pMap->nP
40b0: 74 72 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  trAlloc ){.     
40c0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70   int nNew = pMap
40d0: 2d 3e 6e 50 74 72 41 6c 6c 6f 63 20 3f 20 70 4d  ->nPtrAlloc ? pM
40e0: 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 2a 32 20  ap->nPtrAlloc*2 
40f0: 3a 20 31 36 3b 0a 20 20 20 20 20 20 50 74 72 6d  : 16;.      Ptrm
4100: 61 70 45 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20  apEntry *aNew = 
4110: 28 50 74 72 6d 61 70 45 6e 74 72 79 2a 29 73 71  (PtrmapEntry*)sq
4120: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
4130: 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e 61           pMap->a
4140: 50 74 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  Ptr, nNew*sizeof
4150: 28 50 74 72 6d 61 70 45 6e 74 72 79 29 0a 20 20  (PtrmapEntry).  
4160: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
4170: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
4180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
41a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
41b0: 74 20 6e 42 79 74 65 20 3d 20 28 6e 4e 65 77 2d  t nByte = (nNew-
41c0: 70 4d 61 70 2d 3e 6e 50 74 72 41 6c 6c 6f 63 29  pMap->nPtrAlloc)
41d0: 2a 73 69 7a 65 6f 66 28 50 74 72 6d 61 70 45 6e  *sizeof(PtrmapEn
41e0: 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  try);.        me
41f0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4d 61 70 2d  mset(&aNew[pMap-
4200: 3e 6e 50 74 72 41 6c 6c 6f 63 5d 2c 20 30 2c 20  >nPtrAlloc], 0, 
4210: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
4220: 70 4d 61 70 2d 3e 61 50 74 72 20 3d 20 61 4e 65  pMap->aPtr = aNe
4230: 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 2d  w;.        pMap-
4240: 3e 6e 50 74 72 41 6c 6c 6f 63 20 3d 20 6e 4e 65  >nPtrAlloc = nNe
4250: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  w;.      }.    }
4260: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
4270: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 72 6f 6c  entry to the rol
4280: 6c 62 61 63 6b 20 6c 6f 67 20 69 66 20 72 65 71  lback log if req
4290: 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  uired */.    if(
42a0: 20 70 4d 61 70 2d 3e 6e 53 76 70 74 3e 30 20 26   pMap->nSvpt>0 &
42b0: 26 20 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e  & pMap->aPtr[iEn
42c0: 74 72 79 5d 2e 70 61 72 65 6e 74 20 29 7b 0a 20  try].parent ){. 
42d0: 20 20 20 20 20 69 66 28 20 70 4d 61 70 2d 3e 6e       if( pMap->n
42e0: 52 6f 6c 6c 62 61 63 6b 3e 3d 70 4d 61 70 2d 3e  Rollback>=pMap->
42f0: 6e 52 6f 6c 6c 62 61 63 6b 41 6c 6c 6f 63 20 29  nRollbackAlloc )
4300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e  {.        int nN
4310: 65 77 20 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c  ew = pMap->nRoll
4320: 62 61 63 6b 20 3f 20 70 4d 61 70 2d 3e 6e 52 6f  back ? pMap->nRo
4330: 6c 6c 62 61 63 6b 2a 32 20 3a 20 31 36 3b 0a 20  llback*2 : 16;. 
4340: 20 20 20 20 20 20 20 52 6f 6c 6c 62 61 63 6b 45         RollbackE
4350: 6e 74 72 79 20 2a 61 4e 65 77 20 3d 20 28 52 6f  ntry *aNew = (Ro
4360: 6c 6c 62 61 63 6b 45 6e 74 72 79 2a 29 73 71 6c  llbackEntry*)sql
4370: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
4380: 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 2d 3e            pMap->
4390: 61 52 6f 6c 6c 62 61 63 6b 2c 20 6e 4e 65 77 2a  aRollback, nNew*
43a0: 73 69 7a 65 6f 66 28 52 6f 6c 6c 62 61 63 6b 45  sizeof(RollbackE
43b0: 6e 74 72 79 29 0a 20 20 20 20 20 20 20 20 29 3b  ntry).        );
43c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
43d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
43e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
43f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
4400: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4410: 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 20  pMap->aRollback 
4420: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
4430: 20 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63    pMap->nRollbac
4440: 6b 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20  kAlloc = nNew;. 
4450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4460: 0a 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52  ..      pMap->aR
4470: 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52  ollback[pMap->nR
4480: 6f 6c 6c 62 61 63 6b 5d 2e 70 67 6e 6f 20 3d 20  ollback].pgno = 
4490: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 4d 61 70  pgno;.      pMap
44a0: 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 70 4d 61 70  ->aRollback[pMap
44b0: 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 5d 2e 70 61 72  ->nRollback].par
44c0: 65 6e 74 20 3d 20 70 4d 61 70 2d 3e 61 50 74 72  ent = pMap->aPtr
44d0: 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74 3b  [iEntry].parent;
44e0: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 61 52 6f  .      pMap->aRo
44f0: 6c 6c 62 61 63 6b 5b 70 4d 61 70 2d 3e 6e 52 6f  llback[pMap->nRo
4500: 6c 6c 62 61 63 6b 5d 2e 65 54 79 70 65 20 3d 20  llback].eType = 
4510: 70 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72  pMap->aPtr[iEntr
4520: 79 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a  y].eType;.    }.
4530: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
4540: 68 65 20 61 50 74 72 5b 5d 20 61 72 72 61 79 20  he aPtr[] array 
4550: 2a 2f 0a 20 20 20 20 70 4d 61 70 2d 3e 61 50 74  */.    pMap->aPt
4560: 72 5b 69 45 6e 74 72 79 5d 2e 70 61 72 65 6e 74  r[iEntry].parent
4570: 20 3d 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 70   = parent;.    p
4580: 4d 61 70 2d 3e 61 50 74 72 5b 69 45 6e 74 72 79  Map->aPtr[iEntry
4590: 5d 2e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ].eType = eType;
45a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
45b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
45c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
45d0: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29  OMIT_CONCURRENT)
45e0: 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 73 61 76 65  .**.** Open save
45f0: 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
4600: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4610: 6c 72 65 61 64 79 20 6f 70 65 6e 2e 0a 2a 2f 0a  lready open..*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4630: 50 74 72 6d 61 70 42 65 67 69 6e 28 42 74 53 68  PtrmapBegin(BtSh
4640: 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 6e  ared *pBt, int n
4650: 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50 74  Svpt){.  BtreePt
4660: 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
4670: 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70 4d  ->pMap;.  if( pM
4680: 61 70 20 26 26 20 6e 53 76 70 74 3c 70 4d 61 70  ap && nSvpt<pMap
4690: 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20 69  ->nSvpt ){.    i
46a0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 53  nt i;.    if( nS
46b0: 76 70 74 3e 3d 70 4d 61 70 2d 3e 6e 53 76 70 74  vpt>=pMap->nSvpt
46c0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
46d0: 6e 74 20 6e 4e 65 77 20 3d 20 70 4d 61 70 2d 3e  nt nNew = pMap->
46e0: 6e 53 76 70 74 41 6c 6c 6f 63 20 3f 20 70 4d 61  nSvptAlloc ? pMa
46f0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 2a 32 20  p->nSvptAlloc*2 
4700: 3a 20 31 36 3b 0a 20 20 20 20 20 20 69 6e 74 20  : 16;.      int 
4710: 2a 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  *aNew = sqlite3_
4720: 72 65 61 6c 6c 6f 63 28 70 4d 61 70 2d 3e 61 53  realloc(pMap->aS
4730: 76 70 74 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  vpt, sizeof(int)
4740: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20   * nNew);.      
4750: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
4760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
4770: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4790: 20 70 4d 61 70 2d 3e 61 53 76 70 74 20 3d 20 61   pMap->aSvpt = a
47a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  New;.        pMa
47b0: 70 2d 3e 6e 53 76 70 74 41 6c 6c 6f 63 20 3d 20  p->nSvptAlloc = 
47c0: 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nNew;.      }.  
47d0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 70    }..    for(i=p
47e0: 4d 61 70 2d 3e 6e 53 76 70 74 3b 20 69 3c 6e 53  Map->nSvpt; i<nS
47f0: 76 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vpt; i++){.     
4800: 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69 5d 20   pMap->aSvpt[i] 
4810: 3d 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63  = pMap->nRollbac
4820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 61  k;.    }.    pMa
4830: 70 2d 3e 6e 53 76 70 74 20 3d 20 6e 53 76 70 74  p->nSvpt = nSvpt
4840: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4860: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4870: 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
4880: 29 0a 2a 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ).**.** Rollback
4890: 20 28 69 66 20 6f 70 3d 3d 53 41 56 45 50 4f 49   (if op==SAVEPOI
48a0: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 6f 72 20  NT_ROLLBACK) or 
48b0: 72 65 6c 65 61 73 65 20 28 69 66 20 6f 70 3d 3d  release (if op==
48c0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
48d0: 45 29 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  E).** savepoint 
48e0: 69 53 76 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  iSvpt..*/.static
48f0: 20 76 6f 69 64 20 62 74 72 65 65 50 74 72 6d 61   void btreePtrma
4900: 70 45 6e 64 28 42 74 53 68 61 72 65 64 20 2a 70  pEnd(BtShared *p
4910: 42 74 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  Bt, int op, int 
4920: 69 53 76 70 74 29 7b 0a 20 20 42 74 72 65 65 50  iSvpt){.  BtreeP
4930: 74 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42  trmap *pMap = pB
4940: 74 2d 3e 70 4d 61 70 3b 0a 20 20 69 66 28 20 70  t->pMap;.  if( p
4950: 4d 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Map ){.    asser
4960: 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
4970: 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 6f 70 3d  _ROLLBACK || op=
4980: 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
4990: 53 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  SE );.    assert
49a0: 28 20 69 53 76 70 74 3e 3d 30 20 7c 7c 20 28 69  ( iSvpt>=0 || (i
49b0: 53 76 70 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  Svpt==-1 && op==
49c0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
49d0: 43 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 69  CK) );.    if( i
49e0: 53 76 70 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Svpt<0 ){.      
49f0: 70 4d 61 70 2d 3e 6e 53 76 70 74 20 3d 20 30 3b  pMap->nSvpt = 0;
4a00: 0a 20 20 20 20 20 20 70 4d 61 70 2d 3e 6e 52 6f  .      pMap->nRo
4a10: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
4a20: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2d 3e 61    memset(pMap->a
4a30: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ptr, 0, sizeof(P
4a40: 67 6e 6f 29 20 2a 20 70 4d 61 70 2d 3e 6e 50 74  gno) * pMap->nPt
4a50: 72 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 7d 65 6c  rAlloc);.    }el
4a60: 73 65 20 69 66 28 20 69 53 76 70 74 3c 70 4d 61  se if( iSvpt<pMa
4a70: 70 2d 3e 6e 53 76 70 74 20 29 7b 0a 20 20 20 20  p->nSvpt ){.    
4a80: 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
4a90: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
4aa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
4ab0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 70          for(ii=p
4ac0: 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b 2d 31  Map->nRollback-1
4ad0: 3b 20 69 69 3e 3d 70 4d 61 70 2d 3e 61 53 76 70  ; ii>=pMap->aSvp
4ae0: 74 5b 69 53 76 70 74 5d 3b 20 69 69 2d 2d 29 7b  t[iSvpt]; ii--){
4af0: 0a 20 20 20 20 20 20 20 20 20 20 52 6f 6c 6c 62  .          Rollb
4b00: 61 63 6b 45 6e 74 72 79 20 2a 70 20 3d 20 26 70  ackEntry *p = &p
4b10: 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61 63 6b 5b 69  Map->aRollback[i
4b20: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 50 74  i];.          Pt
4b30: 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e 74 72  rmapEntry *pEntr
4b40: 79 20 3d 20 26 70 4d 61 70 2d 3e 61 50 74 72 5b  y = &pMap->aPtr[
4b50: 70 2d 3e 70 67 6e 6f 20 2d 20 70 4d 61 70 2d 3e  p->pgno - pMap->
4b60: 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20  iFirst];.       
4b70: 20 20 20 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e     pEntry->paren
4b80: 74 20 3d 20 70 2d 3e 70 61 72 65 6e 74 3b 0a 20  t = p->parent;. 
4b90: 20 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 2d           pEntry-
4ba0: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
4bb0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4bc0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 61 70 2d     }.      pMap-
4bd0: 3e 6e 53 76 70 74 20 3d 20 69 53 76 70 74 20 2b  >nSvpt = iSvpt +
4be0: 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
4bf0: 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
4c00: 20 70 4d 61 70 2d 3e 6e 52 6f 6c 6c 62 61 63 6b   pMap->nRollback
4c10: 20 3d 20 70 4d 61 70 2d 3e 61 53 76 70 74 5b 69   = pMap->aSvpt[i
4c20: 53 76 70 74 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Svpt];.    }.  }
4c30: 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
4c40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
4c50: 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
4c60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4c70: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 43  alled after an C
4c80: 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
4c90: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20  ction is opened 
4ca0: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
4cb0: 73 65 2e 20 49 74 20 61 6c 6c 6f 63 61 74 65 73  se. It allocates
4cc0: 20 74 68 65 20 42 74 72 65 65 50 74 72 6d 61 70   the BtreePtrmap
4cd0: 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64 20   structure used 
4ce0: 74 6f 20 74 72 61 63 6b 20 70 6f 69 6e 74 65 72  to track pointer
4cf0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  s.** to allocate
4d00: 64 20 70 61 67 65 73 20 61 6e 64 20 7a 65 72 6f  d pages and zero
4d10: 65 73 20 74 68 65 20 6e 46 72 65 65 2f 69 54 72  es the nFree/iTr
4d20: 75 6e 6b 20 66 69 65 6c 64 73 20 69 6e 20 74 68  unk fields in th
4d30: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
4d40: 65 61 64 65 72 20 6f 6e 20 70 61 67 65 20 31 2e  eader on page 1.
4d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4d60: 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63 61  treePtrmapAlloca
4d70: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4d80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4d90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
4da0: 42 74 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  Bt->pMap==0 ){. 
4db0: 20 20 20 42 74 72 65 65 50 74 72 6d 61 70 20 2a     BtreePtrmap *
4dc0: 70 4d 61 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMap = sqlite3_m
4dd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74 72  alloc(sizeof(Btr
4de0: 65 65 50 74 72 6d 61 70 29 29 3b 0a 20 20 20 20  eePtrmap));.    
4df0: 69 66 28 20 70 4d 61 70 3d 3d 30 20 29 7b 0a 20  if( pMap==0 ){. 
4e00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4e10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
4e20: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
4e30: 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
4e40: 61 74 61 5b 33 32 5d 2c 20 30 2c 20 73 69 7a 65  ata[32], 0, size
4e50: 6f 66 28 75 33 32 29 2a 32 29 3b 0a 20 20 20 20  of(u32)*2);.    
4e60: 20 20 6d 65 6d 73 65 74 28 70 4d 61 70 2c 20 30    memset(pMap, 0
4e70: 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50 74  , sizeof(BtreePt
4e80: 72 6d 61 70 29 29 3b 0a 20 20 20 20 20 20 70 4d  rmap));.      pM
4e90: 61 70 2d 3e 69 46 69 72 73 74 20 3d 20 70 42 74  ap->iFirst = pBt
4ea0: 2d 3e 6e 50 61 67 65 20 2b 20 31 3b 0a 20 20 20  ->nPage + 1;.   
4eb0: 20 20 20 70 42 74 2d 3e 70 4d 61 70 20 3d 20 70     pBt->pMap = p
4ec0: 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Map;.    }.  }. 
4ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4ee0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
4ef0: 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
4f00: 54 29 0a 2a 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  T).**.** Free an
4f10: 79 20 42 74 72 65 65 50 74 72 6d 61 70 20 73 74  y BtreePtrmap st
4f20: 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65  ructure allocate
4f30: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
4f40: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 62 74 72 65 65  call to.** btree
4f50: 50 74 72 6d 61 70 41 6c 6c 6f 63 61 74 65 28 29  PtrmapAllocate()
4f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f70: 20 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65   btreePtrmapDele
4f80: 74 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  te(BtShared *pBt
4f90: 29 7b 0a 20 20 42 74 72 65 65 50 74 72 6d 61 70  ){.  BtreePtrmap
4fa0: 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d 3e 70 4d   *pMap = pBt->pM
4fb0: 61 70 3b 0a 20 20 69 66 28 20 70 4d 61 70 20 29  ap;.  if( pMap )
4fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4fd0: 65 65 28 70 4d 61 70 2d 3e 61 52 6f 6c 6c 62 61  ee(pMap->aRollba
4fe0: 63 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ck);.    sqlite3
4ff0: 5f 66 72 65 65 28 70 4d 61 70 2d 3e 61 50 74 72  _free(pMap->aPtr
5000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5010: 72 65 65 28 70 4d 61 70 2d 3e 61 53 76 70 74 29  ree(pMap->aSvpt)
5020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
5030: 65 65 28 70 4d 61 70 29 3b 0a 20 20 20 20 70 42  ee(pMap);.    pB
5040: 74 2d 3e 70 4d 61 70 20 3d 20 30 3b 0a 20 20 7d  t->pMap = 0;.  }
5050: 0a 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 53 51 4c  .}.#else  /* SQL
5060: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
5070: 45 4e 54 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  ENT */.# define 
5080: 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f 63  btreePtrmapAlloc
5090: 61 74 65 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  ate(x) SQLITE_OK
50a0: 0a 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50  .# define btreeP
50b0: 74 72 6d 61 70 44 65 6c 65 74 65 28 78 29 20 0a  trmapDelete(x) .
50c0: 23 20 64 65 66 69 6e 65 20 62 74 72 65 65 50 74  # define btreePt
50d0: 72 6d 61 70 42 65 67 69 6e 28 78 2c 79 29 20 20  rmapBegin(x,y)  
50e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
50f0: 6e 65 20 62 74 72 65 65 50 74 72 6d 61 70 45 6e  ne btreePtrmapEn
5100: 64 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  d(x,y,z) .#endif
5110: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5120: 43 4f 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 73  CONCURRENT */..s
5130: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
5140: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
5150: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
5160: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5170: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
5180: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5190: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
51a0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
51b0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
51c0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
51d0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
51e0: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
51f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
5200: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
5210: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
5220: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
5230: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
5240: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
5250: 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72  utex);.}../* Ver
5260: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
5270: 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68  sor and the BtSh
5280: 61 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74  ared agree about
5290: 20 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72   what is the cur
52a0: 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
52b0: 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73   connetion. This
52c0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
52d0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
52e0: 64 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  de. If the datab
52f0: 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ase .** connecti
5300: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20  on pointers get 
5310: 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20  out-of-sync, it 
5320: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
5330: 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a  routines like.**
5340: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
5350: 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e   to reference an
5360: 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f   stale connectio
5370: 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72  n pointer that r
5380: 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61  eferences a.** a
5390: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74   connection that
53a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f   has already clo
53b0: 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  sed.  This routi
53c0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
53d0: 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  e assert().** st
53e0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e  atements only an
53f0: 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  d for the purpos
5400: 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63  e of double-chec
5410: 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74  king that the bt
5420: 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73  ree code.** does
5430: 20 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61   keep the databa
5440: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f  se connection po
5450: 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74  inters up-to-dat
5460: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5470: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
5480: 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29  red(BtCursor *p)
5490: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
54a0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  orHoldsMutex(p) 
54b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
54c0: 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70  pBtree->db==p->p
54d0: 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69  Bt->db);.}.#endi
54e0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
54f0: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
5500: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
5510: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5520: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5530: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
5540: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
5550: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
5560: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
5570: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
5580: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
5590: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
55a0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
55b0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
55c0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
55d0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
55e0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
55f0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
5600: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
5610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5620: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
5630: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
5640: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
5650: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5660: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5670: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5680: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
5690: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
56a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
56b0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
56c0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
56d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
56e0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
56f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
5700: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
5710: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
5720: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5730: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
5740: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
5750: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
5760: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
5770: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
5780: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
5790: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
57a0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
57b0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
57c0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
57d0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
57e0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
57f0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
5800: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
5810: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
5820: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
5830: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
5840: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
5850: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5860: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
5870: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
5880: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
5890: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
58a0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
58b0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
58c0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
58d0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
58e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
58f0: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
5900: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
5910: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
5920: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
5930: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
5940: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
5950: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
5960: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
5970: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5980: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
5990: 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
59a0: 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
59b0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
59c0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
59d0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20  anging */.  i64 
59e0: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
59f0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
5a00: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
5a10: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
5a20: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
5a30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5a40: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
5a50: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
5a60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5a70: 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61    if( pBtree->ha
5a80: 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20  sIncrblobCur==0 
5a90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
5aa0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
5ab0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
5ac0: 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e  e) );.  pBtree->
5ad0: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
5ae0: 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72   0;.  for(p=pBtr
5af0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
5b00: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
5b10: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75  {.    if( (p->cu
5b20: 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e  rFlags & BTCF_In
5b30: 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20  crblob)!=0 ){.  
5b40: 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49      pBtree->hasI
5b50: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a  ncrblobCur = 1;.
5b60: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
5b70: 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20  oRoot==pgnoRoot 
5b80: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
5b90: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
5ba0: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
5bb0: 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
5bc0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
5bd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5be0: 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53  .}..#else.  /* S
5bf0: 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65  tub function whe
5c00: 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d  n INCRBLOB is om
5c10: 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69  itted */.  #defi
5c20: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  ne invalidateInc
5c30: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78  rblobCursors(w,x
5c40: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
5c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
5c60: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
5c70: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
5c80: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
5c90: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
5ca0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
5cb0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
5cc0: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
5cd0: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
5ce0: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
5cf0: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
5d00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
5d10: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
5d20: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
5d30: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
5d40: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
5d50: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
5d60: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
5d70: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
5d80: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
5d90: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
5da0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
5db0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
5dc0: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
5dd0: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
5de0: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
5df0: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
5e00: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
5e10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
5e20: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
5e30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
5e40: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
5e50: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
5e60: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
5e70: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
5e80: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
5e90: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
5ea0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
5eb0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
5ec0: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
5ed0: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
5ee0: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
5ef0: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
5f00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
5f10: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
5f20: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
5f30: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
5f40: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
5f50: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
5f60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5f70: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
5f80: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
5f90: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
5fa0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
5fb0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
5fc0: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
5fd0: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
5fe0: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
5ff0: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
6000: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
6010: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
6020: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
6030: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
6040: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
6050: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
6060: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
6070: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
6080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
6090: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
60a0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
60b0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
60c0: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
60d0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
60e0: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
60f0: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
6100: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
6110: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
6120: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
6130: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
6140: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
6150: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
6160: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
6170: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
6180: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
6190: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
61a0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
61b0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
61c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
61d0: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
61e0: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
61f0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
6200: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
6210: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
6220: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
6230: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
6240: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
6250: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
6260: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
6270: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
6280: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
6290: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
62a0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
62b0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
62c0: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
62d0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
62e0: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
62f0: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
6300: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
6310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
6320: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
6330: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
6340: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
6350: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
6360: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
6370: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
6380: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
6390: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
63a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
63b0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
63c0: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
63d0: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
63e0: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
63f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
6400: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
6410: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
6420: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
6430: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
6440: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6450: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
6460: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
6470: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c  LITE_OK && pgno<
6480: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  =sqlite3BitvecSi
6490: 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ze(pBt->pHasCont
64a0: 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ent) ){.    rc =
64b0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
64c0: 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  t(pBt->pHasConte
64d0: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  nt, pgno);.  }. 
64e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
64f0: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42  *.** Query the B
6500: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
6510: 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  ent vector..**.*
6520: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6530: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
6540: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
6550: 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20  page is removed 
6560: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65  from the.** free
6570: 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e  -list for reuse.
6580: 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73   It returns fals
6590: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
65a0: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a  to retrieve the.
65b0: 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ** page from the
65c0: 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
65d0: 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
65e0: 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75  t' flag set. Tru
65f0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
6600: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6610: 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  GetHasContent(Bt
6620: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
6630: 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65  o pgno){.  Bitve
6640: 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73  c *p = pBt->pHas
6650: 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72  Content;.  retur
6660: 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71  n (p && (pgno>sq
6670: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
6680: 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  p) || sqlite3Bit
6690: 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29  vecTest(p, pgno)
66a0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ));.}../*.** Cle
66b0: 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65  ar (destroy) the
66c0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
66d0: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
66e0: 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  is should be.** 
66f0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
6700: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63  onclusion of eac
6710: 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  h write-transact
6720: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
6730: 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61  oid btreeClearHa
6740: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
6750: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
6760: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
6770: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
6780: 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  );.  pBt->pHasCo
6790: 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ntent = 0;.}../*
67a0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
67b0: 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  of the apPage[] 
67c0: 70 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73  pages for a curs
67d0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
67e0: 69 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41  id btreeReleaseA
67f0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74  llCursorPages(Bt
6800: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6810: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
6820: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
6830: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  e; i++){.    rel
6840: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
6850: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70  pPage[i]);.    p
6860: 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d  Cur->apPage[i] =
6870: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e   0;.  }.  pCur->
6880: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f  iPage = -1;.}../
6890: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
68a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
68b0: 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  ly argument must
68c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
68d0: 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20  d entry.** when 
68e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
68f0: 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61   called (i.e. ha
6900: 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  ve eState==CURSO
6910: 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a  R_VALID). This.*
6920: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73  * function saves
6930: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
6940: 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61  sor key in varia
6950: 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20  bles pCur->nKey 
6960: 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65  and.** pCur->pKe
6970: 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y. SQLITE_OK is 
6980: 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
6990: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
69a0: 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ite error .** co
69b0: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
69c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
69d0: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  r is open on an 
69e0: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
69f0: 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  en the integer k
6a00: 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64  ey.** (the rowid
6a10: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
6a20: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43  Cur->nKey and pC
6a30: 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74  ur->pKey is left
6a40: 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e   set to.** NULL.
6a50: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
6a60: 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d  s open on a non-
6a70: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
6a80: 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  en pCur->pKey is
6a90: 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e   .** set to poin
6aa0: 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20  t to a malloced 
6ab0: 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65  buffer pCur->nKe
6ac0: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  y bytes in size 
6ad0: 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
6ae0: 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  he key..*/.stati
6af0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
6b00: 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
6b10: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
6b20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
6b30: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
6b40: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
6b50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
6b60: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
6b70: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6b80: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6b90: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63  ;..  if( pCur->c
6ba0: 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  urIntKey ){.    
6bb0: 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69  /* Only the rowi
6bc0: 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  d is required fo
6bd0: 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20  r a table btree 
6be0: 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65  */.    pCur->nKe
6bf0: 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
6c00: 49 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29  IntegerKey(pCur)
6c10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6c20: 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62  * For an index b
6c30: 74 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63  tree, save the c
6c40: 6f 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74  omplete key cont
6c50: 65 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ent */.    void 
6c60: 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d  *pKey;.    pCur-
6c70: 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  >nKey = sqlite3B
6c80: 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
6c90: 70 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20  pCur);.    pKey 
6ca0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
6cb0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
6cc0: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
6cd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6ce0: 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43  3BtreePayload(pC
6cf0: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
6d00: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
6d10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6d20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6d30: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
6d40: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
6d50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d60: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
6d70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6d90: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
6da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
6db0: 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74  t( !pCur->curInt
6dc0: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
6dd0: 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ey );.  return r
6de0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
6df0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
6e00: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
6e10: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
6e20: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
6e30: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
6e40: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
6e50: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
6e60: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6e70: 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  EK..**.** The ca
6e80: 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
6e90: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
6ea0: 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65   is valid (has e
6eb0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6ec0: 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  LID).** prior to
6ed0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
6ee0: 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  utine.  .*/.stat
6ef0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
6f00: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6f10: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6f20: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6f30: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
6f40: 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55  ur->eState || CU
6f50: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
6f60: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
6f70: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
6f80: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
6f90: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
6fa0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
6fb0: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6fc0: 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
6fd0: 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  XT ){.    pCur->
6fe0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6ff0: 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  VALID;.  }else{.
7000: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
7010: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  xt = 0;.  }..  r
7020: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65  c = saveCursorKe
7030: 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  y(pCur);.  if( r
7040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7050: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
7060: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
7070: 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Cur);.    pCur->
7080: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7090: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
70a0: 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ..  pCur->curFla
70b0: 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
70c0: 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
70d0: 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73  dOvfl|BTCF_AtLas
70e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
70f0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
7100: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
7110: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
7120: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
7130: 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f  rsOnList(BtCurso
7140: 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  r*,Pgno,BtCursor
7150: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  *);../*.** Save 
7160: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
7170: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78   all cursors (ex
7180: 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68  cept pExcept) th
7190: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a  at are open on.*
71a0: 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  * the table with
71b0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
71c0: 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63  .  "Saving the c
71d0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20  ursor position" 
71e0: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
71f0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  e location in th
7200: 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d  e btree is remem
7210: 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20  bered in such a 
7220: 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20  way that it can 
7230: 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b  be.** moved back
7240: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f   to the same spo
7250: 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65  t after the btre
7260: 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
7270: 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ied.  This.** ro
7280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
7290: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
72a0: 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73  or pExcept is us
72b0: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
72c0: 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65  .** table, for e
72d0: 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44  xample in BtreeD
72e0: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
72f0: 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Insert()..**.** 
7300: 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
7310: 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
7320: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
7330: 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
7340: 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68  h .** cursors sh
7350: 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20  ould have their 
7360: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
7370: 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72  ag set.  The btr
7380: 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f  eeCursor().** ro
7390: 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74  utine enforces t
73a0: 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20  hat rule.  This 
73b0: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65  routine only nee
73c0: 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ds to be called 
73d0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d  in.** the uncomm
73e0: 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78  on case when pEx
73f0: 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43  pect has the BTC
7400: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
7410: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
7420: 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20  xpect!=NULL and 
7430: 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73  if no other curs
7440: 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e  ors are found on
7450: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70   the same root-p
7460: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  age,.** then the
7470: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
7480: 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69  lag on pExpect i
7490: 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76  s cleared, to av
74a0: 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70  oid another.** p
74b0: 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f  ointless call to
74c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
74d0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
74e0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
74f0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
7500: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
7510: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
7520: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
7530: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
7540: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
7550: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
7560: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
7570: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
7580: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
7590: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
75a0: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
75b0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
75c0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
75d0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
75e0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
75f0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
7600: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7610: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7620: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
7630: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
7640: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
7650: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
7660: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
7670: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
7680: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
7690: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
76a0: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
76b0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  k;.  }.  if( p )
76c0: 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73   return saveCurs
76d0: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
76e0: 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20  ot, pExcept);.  
76f0: 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45  if( pExcept ) pE
7700: 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20  xcept->curFlags 
7710: 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c  &= ~BTCF_Multipl
7720: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7730: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  TE_OK;.}../* Thi
7740: 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  s helper routine
7750: 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f   to saveAllCurso
7760: 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75  rs does the actu
7770: 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e  al work of savin
7780: 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73  g.** the cursors
7790: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63   if and when a c
77a0: 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74  ursor is found t
77b0: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  hat actually req
77c0: 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a  uires saving..**
77d0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
77e0: 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73   is that no curs
77f0: 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ors need to be s
7800: 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  aved, so this ro
7810: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b  utine is.** brok
7820: 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20  en out from its 
7830: 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20  caller to avoid 
7840: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63  unnecessary stac
7850: 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65  k pointer moveme
7860: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
7870: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
7880: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
7890: 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ist(.  BtCursor 
78a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *p,         /* T
78b0: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
78c0: 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e  that needs savin
78d0: 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f  g */.  Pgno iRoo
78e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
78f0: 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20  nly save cursor 
7900: 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e  with this iRoot.
7910: 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72   Save all if zer
7920: 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  o */.  BtCursor 
7930: 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44  *pExcept    /* D
7940: 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20  o not save this 
7950: 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64  cursor */.){.  d
7960: 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  o{.    if( p!=pE
7970: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
7980: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
7990: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
79a0: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
79b0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
79c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
79d0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
79e0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
79f0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
7a00: 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
7a10: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
7a20: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
7a30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
7a40: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7a50: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
7a60: 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b  e( p->iPage>0 );
7a70: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
7a80: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
7a90: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
7aa0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
7ab0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
7ac0: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
7ad0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7ae0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
7af0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
7b00: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
7b10: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
7b20: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
7b30: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
7b40: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
7b50: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
7b60: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
7b70: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
7b80: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
7b90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
7ba0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
7bb0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
7bc0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
7bd0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
7be0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
7bf0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
7c00: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
7c10: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
7c20: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
7c30: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
7c40: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
7c50: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
7c60: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
7c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
7c80: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
7c90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
7ca0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
7cb0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
7cc0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
7cd0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
7ce0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
7cf0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
7d00: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
7d10: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
7d20: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
7d30: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
7d40: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
7d50: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
7d60: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
7d70: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
7d80: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
7d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
7da0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
7db0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
7dc0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
7dd0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7df0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
7e00: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
7e10: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
7e20: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
7e30: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
7e40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
7e50: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
7e60: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
7e70: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
7e80: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
7e90: 6f 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ord(pCur->pKeyIn
7ea0: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  fo);.    if( pId
7eb0: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
7ec0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
7ed0: 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  PT;.    sqlite3V
7ee0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
7ef0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
7f00: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
7f10: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
7f20: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
7f30: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ld==0 ){.      r
7f40: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
7f50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
7f60: 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b  oto moveto_done;
7f70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7f80: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
7f90: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7fa0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
7fb0: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
7fc0: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
7fd0: 2c 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f  , pRes);.moveto_
7fe0: 64 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78  done:.  if( pIdx
7ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
8000: 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70  e3DbFree(pCur->p
8010: 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64  KeyInfo->db, pId
8020: 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
8030: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8040: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
8050: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
8060: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
8070: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
8080: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
8090: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
80a0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
80b0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
80c0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
80d0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
80e0: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
80f0: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
8100: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
8110: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
8120: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
8130: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
8140: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
8150: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
8160: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
8170: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
8180: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
8190: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
81a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
81b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
81c0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73   skipNext;.  ass
81d0: 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
81e0: 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
81f0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
8200: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
8210: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
8220: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
8230: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
8240: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
8250: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
8260: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
8270: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
8280: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
8290: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
82a0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
82b0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
82c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
82d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
82e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
82f0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
8300: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
8310: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
8320: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
8330: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
8340: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
8350: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
8360: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
8370: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
8380: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
8390: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
83a0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
83b0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
83c0: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
83d0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
83e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
83f0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
8400: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
8410: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
8420: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
8430: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
8440: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
8450: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
8460: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
8470: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
8480: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
8490: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
84a0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
84b0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
84c0: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
84d0: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
84e0: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
84f0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
8500: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
8510: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
8520: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
8530: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
8540: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
8550: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
8560: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
8570: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
8580: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
8590: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
85a0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
85b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
85c0: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
85d0: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
85e0: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
85f0: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
8600: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
8610: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
8620: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
8630: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
8640: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
8650: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
8660: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
8670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8680: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
8690: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
86a0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
86b0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
86c0: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
86d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
86e0: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
86f0: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
8700: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
8710: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
8720: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
8730: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
8740: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
8750: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
8760: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
8770: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
8780: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
8790: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
87a0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
87b0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
87c0: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
87d0: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
87e0: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
87f0: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
8800: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
8810: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
8820: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
8830: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
8840: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
8850: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
8860: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
8870: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
8880: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
8890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
88a0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
88b0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
88c0: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
88d0: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
88e0: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
88f0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
8900: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
8910: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
8920: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
8930: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
8940: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
8950: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
8960: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8970: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
8980: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
8990: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
89a0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
89b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
89c0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
89d0: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
89e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
89f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
8a00: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
8a10: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
8a20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
8a30: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
8a40: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
8a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
8a60: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
8a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8a80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8a90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8aa0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  INTS./*.** Provi
8ab0: 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  de hints to the 
8ac0: 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72  cursor.  The par
8ad0: 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76  ticular hint giv
8ae0: 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65  en (and the type
8af0: 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  .** and number o
8b00: 66 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61  f the varargs pa
8b10: 72 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74  rameters) is det
8b20: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65  ermined by the e
8b30: 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61  HintType.** para
8b40: 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20  meter.  See the 
8b50: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74  definitions of t
8b60: 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20  he BTREE_HINT_* 
8b70: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69  macros for detai
8b80: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
8b90: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
8ba0: 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
8bb0: 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65  r, int eHintType
8bc0: 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65  , ...){.  /* Use
8bd0: 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d  d only by system
8be0: 20 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65   that substitute
8bf0: 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61   their own stora
8c00: 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23  ge engine */.}.#
8c10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  endif../*.** Pro
8c20: 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20  vide flag hints 
8c30: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  to the cursor..*
8c40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
8c50: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61  reeCursorHintFla
8c60: 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
8c70: 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a  r, unsigned x){.
8c80: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52    assert( x==BTR
8c90: 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d  EE_SEEK_EQ || x=
8ca0: 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20  =BTREE_BULKLOAD 
8cb0: 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75  || x==0 );.  pCu
8cc0: 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a  r->hints = x;.}.
8cd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8ce0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8cf0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
8d00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
8d10: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
8d20: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
8d30: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
8d40: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
8d50: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
8d60: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
8d70: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
8d80: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
8d90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28  **.** Return 0 (
8da0: 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65  not a valid page
8db0: 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69  ) for pgno==1 si
8dc0: 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  nce there is.** 
8dd0: 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61  no pointer map a
8de0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
8df0: 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65  age 1.  The inte
8e00: 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69  grity_check logi
8e10: 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68  c.** requires th
8e20: 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  at ptrmapPageno(
8e30: 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74  *,1)!=1..*/.stat
8e40: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
8e50: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
8e60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
8e70: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
8e80: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
8e90: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
8ea0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8eb0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8ec0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
8ed0: 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30  gno<2 ) return 0
8ee0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
8ef0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
8f00: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
8f10: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
8f20: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
8f30: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
8f40: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
8f50: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
8f60: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
8f70: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
8f80: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
8f90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
8fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
8fb0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
8fc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
8fd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8fe0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
8ff0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
9000: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
9010: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
9020: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
9030: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
9040: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
9050: 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pgno'..**.** If 
9060: 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRC is initiall
9070: 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d  y non-zero (non-
9080: 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20  SQLITE_OK) then 
9090: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
90a0: 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  ** a no-op.  If 
90b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
90c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
90d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77   error code is w
90e0: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
90f0: 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pRC..*/.static v
9100: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74  oid ptrmapPut(Bt
9110: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
9120: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
9130: 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e   Pgno parent, in
9140: 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67  t *pRC){.  DbPag
9150: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
9160: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
9170: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
9180: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
9190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
91a0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
91b0: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
91c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
91d0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
91e0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
91f0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
9200: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
9210: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9220: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9230: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
9240: 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
9250: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
9260: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9270: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
9280: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
9290: 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  * The master-jou
92a0: 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  rnal page number
92b0: 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
92c0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
92d0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
92e0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
92f0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
9300: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
9310: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
9320: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
9330: 45 4e 54 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  ENT.  if( pBt->p
9340: 4d 61 70 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  Map ){.    *pRC 
9350: 3d 20 62 74 72 65 65 50 74 72 6d 61 70 53 74 6f  = btreePtrmapSto
9360: 72 65 28 70 42 74 2c 20 6b 65 79 2c 20 65 54 79  re(pBt, key, eTy
9370: 70 65 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  pe, parent);.   
9380: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
9390: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
93a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
93b0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
93c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
93d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
93e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
93f0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
9400: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
9410: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
9420: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
9430: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
9440: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
9450: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9460: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
9470: 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
9480: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rn;.  }.  offset
9490: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
94a0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
94b0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
94c0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
94d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
94e0: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
94f0: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
9500: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
9510: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
9520: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
9530: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
9540: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
9550: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
9560: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
9570: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
9580: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
9590: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
95a0: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
95b0: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
95c0: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
95d0: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
95e0: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
95f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9600: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
9610: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9630: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
9640: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
9650: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
9660: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
9670: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
9680: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
9690: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
96a0: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
96b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
96c0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
96d0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
96e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
96f0: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
9700: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
9710: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
9720: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
9730: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
9740: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
9750: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
9760: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
9770: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
9780: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
9790: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
97a0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
97b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
97c0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
97d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
97e0: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
97f0: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
9800: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
9810: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
9820: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
9830: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
9840: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9850: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
9860: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
9870: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
9880: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
9890: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
98a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
98b0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
98c0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
98d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
98e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
98f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
9900: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
9910: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
9920: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
9930: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
9940: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
9950: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
9960: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
9970: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9980: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
9990: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
99a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
99b0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
99c0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
99d0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
99e0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
99f0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
9a00: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
9a10: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
9a20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9a30: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
9a40: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
9a50: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
9a60: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
9a70: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
9a80: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
9a90: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
9aa0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
9ab0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
9ac0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
9ad0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
9ae0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
9af0: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
9b00: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
9b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9b20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
9b30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9b40: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
9b50: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
9b60: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
9b70: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
9b80: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
9b90: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
9ba0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
9bb0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
9bc0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
9bd0: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
9be0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
9bf0: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
9c00: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
9c10: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
9c20: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
9c30: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
9c40: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
9c50: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
9c60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
9c70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9c80: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
9c90: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
9ca0: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
9cb0: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
9cc0: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
9cd0: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
9ce0: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
9cf0: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
9d00: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
9d10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9d20: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
9d30: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
9d40: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
9d50: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
9d60: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
9d70: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
9d80: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
9d90: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
9da0: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
9db0: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
9dc0: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
9dd0: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
9de0: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
9df0: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
9e00: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
9e10: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
9e20: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
9e30: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
9e40: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
9e50: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
9e60: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
9e70: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9e80: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
9e90: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
9ea0: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
9eb0: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
9ec0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
9ed0: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
9ee0: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
9ef0: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
9f00: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
9f10: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
9f20: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
9f30: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9f40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9f50: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
9f60: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9f70: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9f80: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9f90: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9fb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9fc0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9fd0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9fe0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9ff0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a000: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
a010: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
a020: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
a030: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
a040: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
a050: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
a060: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
a070: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
a080: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
a090: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
a0a0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
a0b0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
a0c0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
a0d0: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
a0e0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
a0f0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
a100: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
a110: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
a120: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
a130: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
a140: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
a150: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
a160: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
a170: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
a180: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
a190: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
a1a0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
a1b0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
a1c0: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
a1d0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
a1e0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
a1f0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
a200: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
a210: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
a220: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
a230: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
a240: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
a250: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
a260: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
a270: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
a280: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
a290: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
a2a0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
a2b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
a2c0: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
a2d0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
a2e0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
a2f0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
a300: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a310: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
a320: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
a330: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
a340: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
a350: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
a360: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
a370: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
a380: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
a390: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
a3a0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
a3b0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
a3c0: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
a3d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
a3e0: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
a3f0: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
a400: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
a410: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
a420: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
a430: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
a440: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
a450: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
a460: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
a470: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
a480: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
a490: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
a4a0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
a4b0: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
a4c0: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
a4d0: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
a4e0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
a4f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
a500: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
a510: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
a520: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
a530: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
a540: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
a550: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
a560: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
a570: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
a580: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
a590: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
a5a0: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
a5b0: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
a5c0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
a5d0: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
a5e0: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
a5f0: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
a600: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a610: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
a620: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
a630: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a640: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a650: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a660: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
a670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a680: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
a690: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
a6a0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
a6b0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
a6c0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
a6d0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
a6e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a6f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a700: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a710: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
a720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
a730: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a740: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
a750: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
a760: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
a770: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
a780: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a790: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
a7a0: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
a7b0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
a7c0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a7d0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
a7e0: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
a7f0: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
a800: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
a810: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
a820: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
a830: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
a840: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
a850: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
a860: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a880: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
a890: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
a8a0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
a8b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
a8c0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
a8d0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
a8e0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
a8f0: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
a900: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
a910: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
a920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
a930: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
a940: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
a950: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a970: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
a980: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
a990: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a9a0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a9b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
a9c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
a9d0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
a9e0: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
a9f0: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
aa00: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
aa10: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
aa20: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
aa30: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
aa40: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
aa50: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
aa60: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
aa70: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
aa80: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
aa90: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
aaa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
aab0: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
aac0: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
aad0: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
aae0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
aaf0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
ab00: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
ab10: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
ab20: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
ab30: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
ab40: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
ab50: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
ab60: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
ab70: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
ab80: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
ab90: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
aba0: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
abb0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
abc0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
abd0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
abe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
abf0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
ac00: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
ac10: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
ac20: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
ac30: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
ac40: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
ac50: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
ac60: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
ac70: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
ac80: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
ac90: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
aca0: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
acb0: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
acc0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
acd0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ace0: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
acf0: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
ad00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
ad10: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
ad20: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
ad30: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
ad40: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
ad50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ad60: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
ad70: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
ad80: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
ad90: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
ada0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
adb0: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
adc0: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
add0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
ade0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
adf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
ae00: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
ae10: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
ae20: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
ae30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
ae40: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
ae50: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
ae60: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
ae70: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
ae80: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
ae90: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
aea0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
aeb0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
aec0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
aed0: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
aee0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
aef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
af00: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
af10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
af20: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
af30: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
af40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
af50: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
af60: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
af70: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
af80: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
af90: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
afa0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
afb0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
afc0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
afd0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
afe0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
aff0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
b000: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b010: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
b020: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
b030: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
b040: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
b050: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
b060: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
b080: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
b090: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
b0a0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
b0b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b0c0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
b0d0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
b0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b110: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
b120: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
b130: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
b140: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
b150: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
b160: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
b170: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b180: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
b190: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
b1a0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
b1b0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
b1c0: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
b1d0: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
b1e0: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
b1f0: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
b200: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
b210: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
b220: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
b230: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
b240: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
b250: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
b260: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
b270: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
b280: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
b290: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
b2a0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
b2b0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
b2c0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
b2d0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
b2e0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
b2f0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
b300: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
b310: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b320: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
b330: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
b340: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
b350: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
b360: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
b370: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
b380: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
b390: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
b3a0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
b3b0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
b3c0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
b3e0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
b3f0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
b400: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
b410: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
b420: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
b430: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
b440: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
b450: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
b460: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
b470: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
b480: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
b490: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
b4a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
b4b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
b4c0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
b4d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
b4e0: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
b4f0: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
b500: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
b510: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
b520: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
b530: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
b540: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b550: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
b560: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
b570: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
b580: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
b590: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
b5a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
b5b0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
b5c0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
b5d0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
b5e0: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
b5f0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
b600: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
b610: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
b620: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
b630: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
b640: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
b650: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
b660: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
b670: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
b680: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
b690: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
b6a0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
b6b0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
b6c0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
b6d0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
b6e0: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
b6f0: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
b700: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
b710: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
b720: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
b730: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
b740: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
b750: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b760: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
b770: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
b780: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
b790: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
b7a0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
b7b0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
b7c0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
b7d0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
b800: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
b810: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
b820: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
b850: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
b860: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b870: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
b880: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
b890: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
b8a0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
b8b0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
b8c0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
b8d0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
b8e0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
b8f0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
b900: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
b910: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
b920: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
b930: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
b940: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
b950: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
b960: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
b970: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
b980: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
b990: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
b9a0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b9b0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
b9c0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
b9d0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
b9e0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
b9f0: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
ba00: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
ba10: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
ba20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
ba30: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
ba40: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
ba50: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
ba60: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
ba70: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
ba80: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
ba90: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
baa0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
bab0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
bac0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
bad0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
bae0: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
baf0: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
bb00: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
bb10: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
bb20: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
bb30: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
bb40: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bb50: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
bb60: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
bb70: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
bb80: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
bb90: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
bba0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
bbb0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
bbc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
bbd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
bbe0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
bbf0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
bc00: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
bc10: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
bc20: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
bc30: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
bc40: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
bc50: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
bc60: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
bc70: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
bc80: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
bc90: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
bca0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
bcb0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
bcc0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
bcd0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bce0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
bcf0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
bd00: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
bd10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
bd20: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
bd30: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
bd40: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
bd50: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
bd60: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
bd70: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
bd80: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
bd90: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
bda0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
bdb0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
bdc0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
bdd0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
bde0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
bdf0: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
be00: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
be10: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
be20: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
be30: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
be40: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
be50: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
be60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
be70: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
be80: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
be90: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
bea0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
beb0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
bec0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
bed0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
bee0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
bef0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
bf00: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
bf10: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
bf20: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
bf30: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
bf40: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
bf50: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
bf60: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
bf70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
bf80: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
bf90: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
bfa0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
bfb0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
bfc0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
bfd0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
bfe0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
bff0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
c000: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
c010: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
c020: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
c030: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
c040: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
c050: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
c060: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
c070: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
c080: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
c090: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
c0a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
c0b0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
c0c0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
c0d0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
c0e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c0f0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
c100: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
c110: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
c120: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
c130: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
c140: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
c150: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
c160: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
c170: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
c180: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
c190: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
c1a0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
c1b0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
c1c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c1d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
c1e0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
c1f0: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
c200: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
c210: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
c220: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
c230: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
c240: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
c250: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
c260: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
c270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c280: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
c290: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
c2a0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
c2b0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
c2c0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
c2d0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
c2e0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
c2f0: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
c300: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
c310: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
c320: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
c330: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
c340: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
c350: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
c360: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
c370: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
c380: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
c390: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
c3a0: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
c3b0: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
c3c0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
c3d0: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
c3e0: 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74  given. This rout
c3f0: 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20  ine reorganizes 
c400: 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  cells within the
c410: 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74  .** page so that
c420: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
c430: 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  ee-blocks on the
c440: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74   free-block list
c450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
c460: 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68  r nMaxFrag is th
c470: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
c480: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73   of fragmented s
c490: 70 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65  pace that may be
c4a0: 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74  .** present in t
c4b0: 68 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68  he page after th
c4c0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
c4d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  ns..**.** EVIDEN
c4e0: 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36  CE-OF: R-44582-6
c4f0: 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20  0138 SQLite may 
c500: 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d  from time to tim
c510: 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a  e reorganize a.*
c520: 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f  * b-tree page so
c530: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
c540: 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72  no freeblocks or
c550: 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c   fragment bytes,
c560: 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62   all.** unused b
c570: 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e  ytes are contain
c580: 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f  ed in the unallo
c590: 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69  cated space regi
c5a0: 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63  on, and all.** c
c5b0: 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20  ells are packed 
c5c0: 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65  tightly at the e
c5d0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
c5e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
c5f0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
c600: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
c610: 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e   nMaxFrag){.  in
c620: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c640: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c650: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
c660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c670: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
c680: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
c690: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c6a0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
c6b0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
c6c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
c6f0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
c700: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
c710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c720: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
c730: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
c740: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
c750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
c760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
c770: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
c780: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
c790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
c7a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
c7b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
c7c0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
c7f0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
c800: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c810: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
c820: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
c830: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
c840: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
c850: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
c860: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
c870: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c880: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
c890: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
c8a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
c8b0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
c8c0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
c8d0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
c8e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
c8f0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
c900: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
c910: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
c920: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c930: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
c940: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
c950: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c960: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
c970: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c980: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
c990: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
c9a0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
c9b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
c9c0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
c9d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c9e0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
c9f0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ca00: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
ca10: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
ca20: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
ca30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ca40: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
ca50: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
ca60: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
ca70: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
ca80: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
ca90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
caa0: 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46  +3]) );.  iCellF
cab0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
cac0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75  t + 2*nCell;.  u
cad0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
cae0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
caf0: 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  ze;..  /* This b
cb00: 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67  lock handles pag
cb10: 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66  es with two or f
cb20: 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73  ewer free blocks
cb30: 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20   and nMaxFrag.  
cb40: 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67  ** or fewer frag
cb50: 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e  mented bytes. In
cb60: 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
cb70: 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20   faster to move 
cb80: 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72  the.  ** two (or
cb90: 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20   one) blocks of 
cba0: 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d  cells using memm
cbb0: 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68  ove() and add th
cbc0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
cbd0: 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20  offsets to each 
cbe0: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
cbf0: 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
cc00: 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20  y than it is to 
cc10: 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63  .  ** reconstruc
cc20: 74 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  t the entire pag
cc30: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e  e.  */.  if( (in
cc40: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e  t)data[hdr+7]<=n
cc50: 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69  MaxFrag ){.    i
cc60: 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62  nt iFree = get2b
cc70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
cc80: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
cc90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
cca0: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
ccb0: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a  &data[iFree]);..
ccc0: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e        /* pageFin
ccd0: 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65  dSlot() has alre
cce0: 61 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61  ady verified tha
ccf0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72  t free blocks ar
cd00: 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a  e sorted.      *
cd10: 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66  * in order of of
cd20: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
cd30: 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e  page, and that n
cd40: 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a  o block extends.
cd50: 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68        ** past th
cd60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
cd70: 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20  e. Provided the 
cd80: 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64  two free slots d
cd90: 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20  o not .      ** 
cda0: 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75  overlap, this gu
cdb0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
cdc0: 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c  e memmove() call
cdd0: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  s below will not
cde0: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  .      ** overwr
cdf0: 69 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69  ite the usableSi
ce00: 7a 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20  ze byte buffer, 
ce10: 65 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  even if the data
ce20: 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20  base page.      
ce30: 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  ** is corrupt.  
ce40: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ce50: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
ce60: 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20  ree2>iFree );.  
ce70: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
ce80: 65 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  e+get2byte(&data
ce90: 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73  [iFree+2]) <= us
cea0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
ceb0: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
cec0: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65  ==0 || iFree2+ge
ced0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
cee0: 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c  ee2+2]) <= usabl
cef0: 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20  eSize );..      
cf00: 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c  if( 0==iFree2 ||
cf10: 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d   (data[iFree2]==
cf20: 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32  0 && data[iFree2
cf30: 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  +1]==0) ){.     
cf40: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64     u8 *pEnd = &d
cf50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
cf60: 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20   nCell*2];.     
cf70: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20     u8 *pAddr;.  
cf80: 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20        int sz2 = 
cf90: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  0;.        int s
cfa0: 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
cfb0: 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20  ta[iFree+2]);.  
cfc0: 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20        int top = 
cfd0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
cfe0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  dr+5]);.        
cff0: 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20 20  if( iFree2 ){.  
d000: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
d010: 65 2b 73 7a 3e 69 46 72 65 65 32 20 29 20 72 65  e+sz>iFree2 ) re
d020: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d030: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d040: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
d050: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
d060: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
d070: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
d080: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
d090: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
d0a0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
d0b0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
d0c0: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
d0d0: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
d0e0: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
d0f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
d100: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
d110: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
d120: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
d130: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
d140: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
d150: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
d160: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
d170: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
d180: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
d190: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
d1a0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
d1b0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
d1c0: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
d1d0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
d1e0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
d1f0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
d200: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
d210: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
d220: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
d230: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
d240: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
d250: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
d260: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
d270: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
d280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d290: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
d2a0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
d2b0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
d2c0: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
d2d0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
d2e0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
d2f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
d300: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
d310: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
d320: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
d330: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
d340: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
d350: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d360: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
d370: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d380: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
d390: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
d3a0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
d3b0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
d3c0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
d3d0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
d3e0: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
d3f0: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
d400: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
d410: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
d420: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
d430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d440: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d450: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
d460: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
d470: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
d480: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
d490: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
d4a0: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
d4b0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
d4c0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
d4d0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
d4e0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
d4f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
d500: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d510: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
d520: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
d530: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
d540: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
d550: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
d560: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
d570: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
d580: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
d590: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
d5a0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
d5b0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
d5c0: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
d5d0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
d5e0: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
d5f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
d600: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
d610: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
d620: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
d630: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
d640: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d650: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
d660: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
d670: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
d680: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
d690: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
d6a0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
d6b0: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
d6c0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74  size);.  }.  dat
d6d0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20  a[hdr+7] = 0;.. 
d6e0: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a  defragment_out:.
d6f0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37    if( data[hdr+7
d700: 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ]+cbrk-iCellFirs
d710: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
d720: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d730: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d740: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
d750: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
d760: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
d770: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
d780: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
d790: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
d7a0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
d7b0: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
d7c0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
d7d0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
d7e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d7f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d800: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d810: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d820: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d830: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
d840: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
d850: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
d860: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
d870: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
d880: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
d890: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
d8a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
d8b0: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
d8c0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
d8d0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
d8e0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
d8f0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
d900: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
d910: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
d920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d930: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
d940: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
d950: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
d960: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
d970: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
d980: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
d990: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
d9a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
d9b0: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
d9c0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
d9d0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
d9e0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
d9f0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
da00: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
da10: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
da20: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
da30: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
da40: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
da50: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
da60: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
da70: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
da80: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
da90: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
daa0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
dab0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
dac0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
dad0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
dae0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
daf0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
db00: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
db10: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
db20: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
db30: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
db40: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
db50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
db60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
db70: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
db80: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
db90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
dba0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
dbb0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
dbc0: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
dbd0: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
dbe0: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
dbf0: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
dc00: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
dc10: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
dc20: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
dc30: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
dc40: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
dc50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dc60: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
dc70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
dc80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
dc90: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
dca0: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
dcb0: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
dcc0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
dcd0: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
dce0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
dcf0: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
dd00: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
dd10: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
dd20: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
dd30: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
dd40: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
dd50: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
dd60: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
dd70: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
dd80: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
dd90: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
dda0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
ddb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
ddc0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
ddd0: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
dde0: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
ddf0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
de00: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
de10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
de20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
de30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
de40: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
de50: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
de60: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
de70: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
de80: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
de90: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
dea0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
deb0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
dec0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
ded0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
dee0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
def0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
df00: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
df10: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
df20: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
df30: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
df40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
df50: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
df60: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
df70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
df80: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
df90: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
dfa0: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
dfb0: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
dfc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dfd0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
dfe0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
dff0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
e000: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
e010: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
e020: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
e030: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
e040: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
e050: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
e060: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
e070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e080: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
e090: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
e0a0: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
e0b0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
e0c0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
e0d0: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
e0e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e0f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
e100: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
e110: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
e120: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
e130: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
e140: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
e150: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
e160: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
e170: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
e180: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
e190: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
e1a0: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
e1b0: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
e1c0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
e1d0: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
e1e0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
e1f0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
e200: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
e210: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
e220: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
e230: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
e240: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
e250: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
e260: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
e270: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
e280: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
e290: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
e2a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e2b0: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
e2c0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
e2d0: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
e2e0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
e2f0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
e300: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
e310: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
e320: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
e330: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
e340: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
e350: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
e360: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
e370: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
e380: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
e390: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
e3a0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
e3b0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
e3c0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
e3d0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
e3e0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
e3f0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
e400: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
e410: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
e420: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
e430: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
e440: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
e450: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
e480: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
e490: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
e4a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4c0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
e4d0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
e4e0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
e4f0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
e500: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
e510: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
e520: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
e530: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e540: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
e550: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
e560: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e570: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
e580: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e590: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e5a0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e5b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
e5c0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
e5d0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e5e0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
e5f0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
e600: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
e610: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
e620: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
e630: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
e640: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e650: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
e660: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
e670: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
e680: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
e690: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
e6a0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e6b0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
e6c0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
e6d0: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
e6e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e6f0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
e700: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
e710: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
e720: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
e730: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
e740: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
e750: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
e760: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
e770: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
e780: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
e790: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
e7a0: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
e7b0: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
e7c0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
e7d0: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
e7e0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
e7f0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
e800: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
e810: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
e820: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
e830: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
e840: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e850: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
e860: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
e870: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e880: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
e890: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
e8a0: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
e8b0: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
e8c0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
e8d0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e8e0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
e8f0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
e900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e920: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
e930: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
e940: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
e950: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
e960: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
e970: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
e980: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
e990: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
e9a0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
e9b0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
e9c0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
e9d0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
e9e0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
e9f0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
ea00: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
ea10: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
ea20: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
ea30: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
ea40: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
ea50: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
ea60: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
ea70: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
ea80: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
ea90: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
eaa0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
eab0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
eac0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
ead0: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
eae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
eaf0: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
eb00: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
eb10: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
eb20: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
eb30: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
eb40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eb50: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
eb60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
eb70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
eb80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
eb90: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
eba0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
ebb0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
ebc0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
ebd0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
ebe0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
ebf0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
ec00: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
ec10: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
ec20: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
ec30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ec40: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
ec50: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
ec60: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
ec70: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
ec80: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
ec90: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
eca0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
ecb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
ecc0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ecd0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ece0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
ecf0: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
ed00: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
ed10: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
ed20: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
ed30: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
ed40: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ed50: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ed60: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ed70: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ed80: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ed90: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
eda0: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
edb0: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
edc0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
edd0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
ede0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
edf0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
ee00: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
ee10: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
ee20: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
ee30: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
ee40: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
ee50: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
ee60: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
ee70: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ee80: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
ee90: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
eea0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
eeb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
eec0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
eed0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
eee0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
eef0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
ef00: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
ef10: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
ef20: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
ef30: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
ef40: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
ef50: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
ef60: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
ef70: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
ef80: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
ef90: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
efa0: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
efb0: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
efc0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
efd0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
efe0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
eff0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
f000: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
f010: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
f020: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
f030: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
f040: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
f050: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
f060: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
f070: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
f080: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
f090: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
f0a0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
f0b0: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
f0c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
f0d0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
f0e0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
f0f0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
f100: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
f110: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
f120: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
f130: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
f140: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
f150: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
f160: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
f170: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
f1a0: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
f1b0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
f1c0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
f1f0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
f200: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f230: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
f240: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
f250: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
f280: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
f290: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
f2a0: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
f2d0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
f2e0: 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67  u32 iLast = pPag
f2f0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
f300: 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74  ze-4; /* Largest
f310: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
f320: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
f330: 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72  u32 iEnd = iStar
f340: 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20  t + iSize;      
f350: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
f360: 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74  yte past the iSt
f370: 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  art buffer */.  
f380: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
f390: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
f3a0: 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f  ta;   /* Page co
f3b0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
f3c0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
f3d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
f3e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
f3f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
f400: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
f410: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
f420: 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d  | iStart>=pPage-
f430: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61  >hdrOffset+6+pPa
f440: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
f450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
f460: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64  RRUPT_DB || iEnd
f470: 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
f480: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f490: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f4a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f4b0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f4c0: 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65  .  assert( iSize
f4d0: 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=4 );   /* Mini
f4e0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
f4f0: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
f500: 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b  iStart<=iLast );
f510: 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65  ..  /* Overwrite
f520: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
f530: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
f540: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
f550: 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69  delete.  ** opti
f560: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
f570: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
f580: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
f590: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
f5a0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
f5b0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ata[iStart], 0, 
f5c0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iSize);.  }..  /
f5d0: 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72  * The list of fr
f5e0: 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  eeblocks must be
f5f0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f600: 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a  der.  Find the .
f610: 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65    ** spot on the
f620: 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61   list where iSta
f630: 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rt should be ins
f640: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64  erted..  */.  hd
f650: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
f660: 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68  fset;.  iPtr = h
f670: 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61  dr + 1;.  if( da
f680: 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26  ta[iPtr+1]==0 &&
f690: 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29   data[iPtr]==0 )
f6a0: 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d  {.    iFreeBlk =
f6b0: 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74   0;  /* Shortcut
f6c0: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
f6d0: 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  en the freelist 
f6e0: 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65  is empty */.  }e
f6f0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
f700: 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32  (iFreeBlk = get2
f710: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
f720: 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20  ))<iStart ){.   
f730: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c     if( iFreeBlk<
f740: 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  iPtr+4 ){.      
f750: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d    if( iFreeBlk==
f760: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f770: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f780: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74       }.      iPt
f7a0: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
f7b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
f7c0: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
f7d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f7e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
f7f0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
f800: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
f810: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
f820: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
f830: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
f840: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
f850: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
f860: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
f870: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
f880: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
f890: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
f8a0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
f8b0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
f8c0: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
f8d0: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
f8e0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
f8f0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
f900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
f910: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
f920: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
f930: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
f940: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
f950: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
f960: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
f970: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f980: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
f990: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
f9a0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
f9b0: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
f9c0: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
f9d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
f9e0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f9f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
fa00: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
fa10: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
fa20: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
fa30: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
fa40: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
fa50: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
fa60: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
fa70: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
fa80: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
fa90: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
faa0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
fab0: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
fac0: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
fad0: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
fae0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
faf0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
fb00: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
fb10: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
fb20: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
fb30: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
fb40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
fb50: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
fb60: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
fb70: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
fb80: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
fb90: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
fba0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fbb0: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
fbc0: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
fbd0: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
fbe0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
fbf0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
fc00: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
fc10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc20: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
fc30: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
fc40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fc50: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
fc60: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
fc70: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
fc80: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
fc90: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
fca0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
fcb0: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
fcc0: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
fcd0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
fce0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
fcf0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
fd00: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
fd10: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
fd20: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
fd30: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
fd40: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
fd50: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
fd60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
fd70: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
fd80: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
fd90: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
fda0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
fdb0: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
fdc0: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
fdd0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
fde0: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
fdf0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
fe00: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
fe10: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
fe20: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
fe30: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
fe40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
fe50: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
fe60: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
fe70: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
fe80: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
fe90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fea0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
feb0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
fec0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fed0: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
fee0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
fef0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
ff00: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
ff10: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
ff20: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
ff30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
ff40: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
ff50: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
ff60: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
ff70: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
ff80: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
ff90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
ffa0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
ffb0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
ffc0: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
ffd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ffe0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
fff0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
10000 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
10010 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
10020 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
10030 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
10040 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10050 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
10060 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
10070 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
10080 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
10090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
100a0 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
100b0 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
100c0 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
100d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
100e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
100f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
10100 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
10110 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
10120 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
10130 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
10140 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
10150 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
10160 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
10170 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
10180 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
10190 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
101a0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
101b0 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
101c0 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
101d0 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
101e0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
101f0 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d  NCE-OF: R-07291-
10200 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66  35328 A value of
10210 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20   5 (0x05) means 
10220 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
10230 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74     ** interior t
10240 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
10250 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
10260 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
10270 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b  TF_INTKEY)==5 );
10280 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10290 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31  -OF: R-26900-091
102a0 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33  76 A value of 13
102b0 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68   (0x0d) means th
102c0 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
102d0 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d  ** leaf table b-
102e0 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
102f0 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
10300 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
10310 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
10320 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
10330 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
10340 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
10350 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
10360 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
10370 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
10380 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
10390 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
103a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
103b0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
103c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
103d0 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
103e0 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
103f0 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  d;.      pPage->
10400 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
10410 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
10420 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20  Payload;.    }. 
10430 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
10440 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
10450 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
10460 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
10470 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
10480 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
10490 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
104a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
104b0 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41   R-43316-37308 A
104c0 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30   value of 2 (0x0
104d0 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  2) means the pag
104e0 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
104f0 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d  nterior index b-
10500 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
10510 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
10520 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
10530 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10540 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38  F: R-59615-42828
10550 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28   A value of 10 (
10560 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0a) means the 
10570 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
10580 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72   leaf index b-tr
10590 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
105a0 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
105b0 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
105c0 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
105d0 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
105e0 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
105f0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
10600 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
10610 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
10620 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
10630 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
10640 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
10650 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
10660 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
10670 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
10680 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10690 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
106a0 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
106b0 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
106c0 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
106d0 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
106e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
10700 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
10710 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
10720 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
10730 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
10740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10750 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
10760 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
10770 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
10780 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
10790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
107a0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
107b0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
107c0 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
107d0 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
107e0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
107f0 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
10800 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
10810 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
10820 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
10830 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
10840 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
10850 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
10860 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
10870 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
10880 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
10890 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
108a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
108b0 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
108c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
108d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
108e0 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
108f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
10900 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
10910 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10920 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10930 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10950 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
10960 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
10970 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
10980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
10990 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
109a0 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
109b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
109c0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
109d0 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
109e0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
109f0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
10a00 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
10a10 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 3b  t ){.    int pc;
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10a30 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
10a40 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
10a50 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
10a60 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
10a70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10a80 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
10a90 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
10aa0 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
10ab0 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
10ac0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
10ad0 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
10ae0 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
10af0 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
10b00 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
10b10 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
10b20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
10b30 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
10b40 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
10b50 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
10b60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
10b70 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
10b80 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
10b90 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
10ba0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
10bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
10bc0 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
10bd0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
10be0 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
10bf0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
10c00 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10c10 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
10c20 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
10c30 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
10c40 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
10c50 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
10c60 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
10c70 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
10c80 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
10c90 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10ca0 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
10cb0 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
10cc0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10cd0 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
10ce0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
10cf0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
10d00 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
10d10 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
10d20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
10d30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
10d40 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
10d50 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
10d60 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
10d70 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
10d80 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
10d90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10da0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
10db0 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
10dc0 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
10dd0 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
10de0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
10df0 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
10e00 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
10e10 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10e20 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
10e30 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
10e40 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
10e50 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
10e60 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
10e70 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
10e80 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
10e90 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10ea0 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
10eb0 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
10ec0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
10ed0 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
10ee0 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
10ef0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10f00 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10f10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
10f20 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
10f30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10f40 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10f50 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
10f60 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10f70 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10f80 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10f90 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10fa0 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
10fb0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
10fc0 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
10fd0 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
10fe0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
10ff0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
11000 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
11010 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
11020 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11030 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
11040 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
11050 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
11060 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
11070 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
11080 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
11090 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
110a0 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
110b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
110c0 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
110d0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
110e0 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
110f0 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
11100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11120 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
11130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
11140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
11150 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
11160 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
11170 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
11180 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
11190 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
111a0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
111b0 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
111c0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
111d0 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
111e0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
111f0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
11200 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
11210 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
11220 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
11230 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
11240 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
11250 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
11260 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
11270 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
11280 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
11290 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
112a0 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
112b0 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
112c0 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
112d0 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
112e0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
112f0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
11300 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11310 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
11320 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
11330 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
11340 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
11350 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
11360 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
11370 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
11380 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
11390 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
113a0 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
113b0 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
113c0 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
113d0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
113e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
113f0 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
11400 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
11410 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
11420 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
11430 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
11440 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11450 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
11460 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
11470 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
11480 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
11490 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
114a0 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
114b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
114c0 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
114d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
114e0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
114f0 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
11500 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
11510 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
11520 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
11530 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
11540 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
11550 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
11560 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
11570 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
11580 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
11590 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
115a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
115b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
115c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
115d0 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
115e0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
115f0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
11600 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
11610 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
11620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
11630 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
11640 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
11650 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11660 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
11670 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11680 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
11690 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
116a0 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
116b0 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
116c0 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
116d0 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
116e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
116f0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
11700 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11710 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
11720 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
11730 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
11740 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
11750 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
11760 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
11770 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
11780 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
11790 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
117a0 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
117b0 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
117c0 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
117d0 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
117e0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
117f0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  ce */.    if( pc
11800 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
11810 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
11820 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
11830 72 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rst ){.        /
11840 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11850 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
11860 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
11870 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
11880 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
11890 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
118a0 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
118b0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
118c0 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  eeblock..       
118d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
118e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
118f0 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
11900 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  .      while( 1 
11910 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11920 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
11930 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11940 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11950 4b 50 54 3b 20 2f 2a 20 46 72 65 65 62 6c 6f 63  KPT; /* Freebloc
11960 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
11970 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
11980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
11990 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
119a0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
119b0 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
119c0 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
119d0 0a 20 20 20 20 20 20 20 20 6e 46 72 65 65 20 3d  .        nFree =
119e0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
119f0 20 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c         if( next<
11a00 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65  =pc+size+3 ) bre
11a10 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  ak;.        pc =
11a20 20 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20   next;.      }. 
11a30 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20       if( next>0 
11a40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11a50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11a60 5f 42 4b 50 54 3b 20 20 2f 2a 20 46 72 65 65 62  _BKPT;  /* Freeb
11a70 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65  lock not in asce
11a80 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
11a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11aa0 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e   pc+size>(unsign
11ab0 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a  ed int)usableSiz
11ac0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e ){.        ret
11ad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11ae0 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 4c 61 73  PT_BKPT;  /* Las
11af0 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65  t freeblock exte
11b00 6e 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e  nds past page en
11b10 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  d */.      }.   
11b20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
11b30 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
11b40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
11b50 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
11b60 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
11b70 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
11b80 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
11b90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11ba0 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
11bb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
11bc0 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
11bd0 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
11be0 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
11bf0 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
11c00 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
11c10 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
11c20 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
11c30 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
11c40 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
11c50 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
11c60 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
11c70 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
11c80 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
11c90 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
11ca0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
11cb0 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
11cc0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
11cd0 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
11ce0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
11cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11d00 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
11d10 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
11d20 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
11d30 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
11d40 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11d50 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
11d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11d70 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
11d80 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
11d90 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
11da0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
11db0 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
11dc0 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
11dd0 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
11de0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
11df0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
11e00 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
11e10 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
11e20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11e30 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11e40 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
11e50 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
11e60 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
11e70 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11e80 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
11e90 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11ea0 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
11eb0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11ec0 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11ed0 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11ee0 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11ef0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11f00 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11f10 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
11f20 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11f30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
11f40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
11f50 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
11f60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11f70 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11f80 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
11f90 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
11fa0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
11fb0 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
11fc0 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
11fd0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
11fe0 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
11ff0 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
12000 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
12010 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
12020 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
12030 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
12040 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
12050 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
12060 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
12070 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
12080 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
12090 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
120a0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
120b0 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
120c0 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
120d0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
120e0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
120f0 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
12100 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
12110 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
12120 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
12130 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
12140 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
12150 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
12160 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
12170 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  trSize];.  pPage
12180 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
12190 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
121a0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
121b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
121c0 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
121d0 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
121e0 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
121f0 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
12200 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
12210 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
12220 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
12230 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
12240 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
12250 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
12260 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
12270 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
12280 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
12290 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
122a0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
122b0 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
122c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
122d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
122e0 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
122f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12300 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
12310 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e  f( pgno!=pPage->
12320 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
12330 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
12340 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12350 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61  DbPage);.    pPa
12360 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
12370 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65  bPage;.    pPage
12380 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
12390 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
123a0 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  gno;.    pPage->
123b0 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f  hdrOffset = pgno
123c0 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
123d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
123e0 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  ge->aData==sqlit
123f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12400 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
12410 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
12420 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
12430 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
12440 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
12450 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
12460 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
12470 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
12480 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
12490 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
124a0 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
124b0 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
124c0 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
124d0 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
124e0 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
124f0 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
12500 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
12510 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
12520 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
12530 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
12540 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
12550 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
12560 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
12570 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
12580 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
12590 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
125a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
125b0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
125c0 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
125d0 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
125e0 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
125f0 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
12600 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
12610 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
12620 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
12630 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
12640 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
12650 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
12660 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
12670 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12680 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12690 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
126a0 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
126b0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
126c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
126d0 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
126e0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
126f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
12700 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
12710 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
12720 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
12730 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
12740 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
12750 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
12760 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
12770 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
12780 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
12790 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
127a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
127b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
127c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
127d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
127e0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
127f0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
12800 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
12810 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
12820 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
12830 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
12840 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12850 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
12860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
12880 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
12890 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
128a0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
128b0 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
128c0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
128d0 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
128e0 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
128f0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
12900 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
12910 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
12920 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
12930 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
12940 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
12950 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
12960 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
12970 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
12980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12990 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
129a0 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
129b0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
129c0 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
129d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
129e0 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
129f0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
12a00 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12a10 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12a40 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12a60 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
12a70 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
12a80 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
12a90 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
12aa0 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
12ab0 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
12ac0 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
12ad0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
12ae0 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
12af0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
12b00 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
12b10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12b20 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
12b30 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
12b40 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
12b50 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
12b60 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
12b70 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
12b80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
12b90 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
12ba0 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
12bb0 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
12bc0 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
12bd0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
12be0 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
12bf0 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
12c00 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
12c10 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
12c20 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
12c30 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
12c40 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
12c50 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
12c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
12c70 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
12c80 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
12c90 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
12ca0 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
12cb0 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
12cc0 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
12cd0 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
12ce0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
12cf0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12d00 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
12d10 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
12d20 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
12d30 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
12d40 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
12d50 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
12d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
12d70 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
12d80 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12da0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
12db0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
12dc0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
12dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12de0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12df0 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12e00 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12e20 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12e30 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
12e40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e60 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
12e70 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
12e80 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
12e90 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
12ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
12eb0 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
12ec0 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
12ed0 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
12ee0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
12ef0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12f00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12f10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12f20 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12f30 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67  ge==&pCur->apPag
12f40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
12f60 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79  ==0 || bReadOnly
12f70 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  ==pCur->curPager
12f80 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72  Flags );.  asser
12f90 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43  t( pCur==0 || pC
12fa0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a  ur->iPage>0 );..
12fb0 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65    if( pgno>btree
12fc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
12fd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12ff0 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
13000 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
13010 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
13020 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
13030 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
13040 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
13050 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69   bReadOnly);.  i
13060 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  f( rc ){.    got
13070 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
13080 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70  _error;.  }.  *p
13090 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
130a0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
130b0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
130c0 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
130d0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
130e0 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d     btreePageFrom
130f0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
13100 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
13110 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
13120 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
13130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13150 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
13160 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74  ;.      goto get
13170 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13180 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  r;.    }.  }.  a
13190 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
131a0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
131b0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
131c0 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  ge)->aData==sqli
131d0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
131e0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
131f0 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61  * If obtaining a
13200 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20   child page for 
13210 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73  a cursor, we mus
13220 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  t verify that th
13230 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63  e page is.  ** c
13240 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
13250 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f  he root page. */
13260 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28  .  if( pCur && (
13270 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c  (*ppPage)->nCell
13280 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  <1 || (*ppPage)-
13290 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63  >intKey!=pCur->c
132a0 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20  urIntKey) ){.   
132b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
132c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
132d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
132e0 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
132f0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
13300 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
13310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
13320 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
13330 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20  r:.  if( pCur ) 
13340 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
13350 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
13360 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13370 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
13380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
13390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
133a0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
133b0 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
133c0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
133d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
133e0 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
133f0 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
13400 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
13410 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
13420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
13430 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13440 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
13450 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
13460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13470 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
13480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13490 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
134a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
134b0 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
134c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
134d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
134e0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
134f0 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
13500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13510 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13520 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
13530 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
13540 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
13550 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13560 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13570 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
13580 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
13590 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
135a0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
135b0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
135c0 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
135d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
135e0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
135f0 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
13600 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
13610 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
13620 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
13630 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
13640 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
13650 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
13660 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
13670 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
13680 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
13690 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
136a0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
136b0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
136c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
136d0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
136e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
136f0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
13700 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
13710 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
13720 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
13730 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
13740 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
13750 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
13760 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
13770 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
13780 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
13790 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
137a0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
137b0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
137c0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
137d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
137e0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
137f0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
13800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13810 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
13820 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
13830 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
13840 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
13850 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13860 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
13870 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
13880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
138a0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
138b0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
138c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
138d0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
138e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
138f0 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
13900 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
13910 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
13920 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
13930 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
13940 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
13950 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
13960 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
13970 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
13980 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
13990 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
139a0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
139b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
139c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
139d0 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
139e0 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
139f0 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
13a00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
13a10 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
13a20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
13a30 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
13a40 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
13a50 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
13a60 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
13a70 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
13a80 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
13a90 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
13aa0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
13ab0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13ac0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13ad0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
13ae0 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
13af0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13b00 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
13b10 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
13b20 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
13b30 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
13b40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13b50 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
13b60 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
13b70 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
13b80 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
13b90 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
13ba0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
13bb0 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
13bc0 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
13bd0 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
13be0 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
13bf0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
13c00 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
13c10 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
13c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13c30 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
13c40 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
13c50 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
13c60 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
13c70 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
13c80 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
13c90 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
13ca0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
13cb0 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
13cc0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
13cd0 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
13ce0 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
13cf0 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
13d00 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
13d10 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
13d20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13d30 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
13d40 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
13d50 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
13d60 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
13d70 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
13d80 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
13d90 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
13da0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
13db0 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
13dc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13dd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
13de0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
13df0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
13e00 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13e10 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
13e20 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
13e30 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
13e40 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
13e50 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
13e60 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
13e70 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
13e80 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
13e90 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
13ea0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
13eb0 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
13ec0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13ed0 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
13ee0 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
13ef0 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
13f00 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
13f10 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
13f20 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
13f30 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
13f40 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
13f50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
13f60 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
13f70 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
13f80 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
13f90 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
13fa0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
13fb0 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
13fc0 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
13fd0 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
13fe0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
13ff0 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
14000 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
14010 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
14020 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
14030 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
14040 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
14050 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
14060 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
14070 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
14080 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14090 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
140a0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
140b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
140c0 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
140d0 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
140e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
140f0 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
14100 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
14110 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
14120 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
14130 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
14140 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
14150 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
14160 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14170 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
14180 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
14190 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
141a0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
141b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
141c0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
141d0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
141e0 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
141f0 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
14200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
14210 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
14220 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
14230 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
14240 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
14250 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
14260 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
14270 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
14280 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
14290 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
142a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
142b0 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
142c0 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
142d0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
142e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
142f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
14300 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
14310 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
14320 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
14330 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
14340 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
14350 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
14360 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
14370 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
14380 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
14390 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143b0 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
143c0 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
143d0 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
143e0 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
143f0 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
14400 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
14410 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
14420 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
14430 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14440 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
14450 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
14460 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
14470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
14480 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
14490 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
144a0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
144b0 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
144c0 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
144d0 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
144e0 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
144f0 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
14500 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
14510 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
14520 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
14530 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
14540 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
14550 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
14560 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
14570 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
14580 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14590 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
145a0 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
145b0 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
145c0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
145d0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
145e0 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
145f0 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
14600 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
14610 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
14620 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
14630 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
14640 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
14660 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
14670 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
14680 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
146a0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
146b0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
146c0 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
146d0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
146e0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
146f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
14700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14710 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
14720 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
14730 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
14740 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
14750 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
14760 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
14770 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
14780 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
14790 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
147a0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
147b0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
147c0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
147d0 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
147e0 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
147f0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
14800 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
14810 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
14820 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
14830 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
14840 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
14850 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
14860 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
14870 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
14880 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
14890 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
148a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
148b0 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
148c0 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
148d0 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
148e0 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
148f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14900 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
14910 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
14920 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
14930 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
14940 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
14950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14960 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14970 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
14980 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
14990 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
149a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
149b0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
149c0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
149d0 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
149e0 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
149f0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
14a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14a10 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14a30 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
14a40 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
14a50 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
14a60 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
14a70 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
14a80 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
14a90 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
14aa0 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
14ab0 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
14ac0 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
14ad0 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
14ae0 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
14af0 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
14b00 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
14b10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14b20 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
14b30 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
14b40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14b50 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
14b60 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
14b70 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
14b80 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
14b90 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
14ba0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
14bb0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
14bc0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
14bd0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
14be0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
14bf0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14c00 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
14c10 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
14c20 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
14c30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
14c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14c50 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
14c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14c70 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
14c80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
14c90 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14ca0 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
14cb0 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
14cc0 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
14cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14cf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
14d00 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
14d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14d50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
14d60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
14d70 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14d80 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
14d90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14da0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14db0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14dc0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
14dd0 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14de0 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
14df0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14e00 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14e10 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
14e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14e30 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
14e40 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
14e50 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14e60 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14e70 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14e80 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
14e90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14ea0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
14eb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
14ec0 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
14ed0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14ee0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
14ef0 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
14f00 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
14f10 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
14f20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
14f30 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
14f40 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
14f50 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
14f60 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
14f90 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
14fa0 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
14fb0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
14fc0 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
14fd0 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
14fe0 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
14ff0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
15000 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
15010 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
15020 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
15030 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
15040 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15060 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15070 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15090 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
150a0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
150b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
150c0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
150d0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
150e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
150f0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
15100 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15110 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
15120 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15140 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
15150 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
15160 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
15170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15180 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15190 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
151a0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
151b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
151c0 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
151d0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
151e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
151f0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
15200 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
15210 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
15220 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
15230 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
15240 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
15250 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
15260 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
15270 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
15280 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
15290 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
152a0 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
152b0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
152c0 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
152d0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
152e0 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
152f0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
15300 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
15310 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
15320 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
15330 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
15340 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
15350 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
15360 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
15370 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
15380 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
15390 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
153a0 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
153b0 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
153c0 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
153d0 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
153e0 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
153f0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
15400 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
15410 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15420 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
15430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15440 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
15450 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
15460 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
15470 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15480 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
15490 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
154a0 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
154b0 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
154c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
154d0 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
154e0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
154f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15500 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
15510 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
15520 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
15530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15540 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
15550 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
15560 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
15590 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
155a0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
155b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
155c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
155d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
155e0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
155f0 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
15600 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15610 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
15620 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
15630 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
15640 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
15650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15670 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
15680 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
15690 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
156a0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
156b0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
156c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
156d0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
156e0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
156f0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
15700 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
15710 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
15720 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
15730 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
15740 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
15750 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
15760 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
15770 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
15780 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15790 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
157a0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
157b0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
157c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
157d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
157e0 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
157f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
15800 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
15810 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
15820 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
15830 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
15840 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
15850 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
15860 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
15870 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
15880 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
15890 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
158a0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
158b0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
158c0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
158d0 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
158e0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
158f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
15900 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
15910 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
15920 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
15930 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
15940 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
15950 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
15960 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
15970 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
15980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15990 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
159a0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
159b0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
159c0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
159d0 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
159e0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
159f0 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
15a00 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
15a10 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
15a20 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
15a30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
15a40 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
15a50 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
15a60 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
15a70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
15a80 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
15a90 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
15aa0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
15ab0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
15ac0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
15ad0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
15ae0 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
15af0 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
15b00 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
15b10 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
15b20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
15b30 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
15b40 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
15b50 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
15b60 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
15b70 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15b80 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
15b90 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
15ba0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
15bb0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
15bc0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
15bd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
15be0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15bf0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
15c00 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
15c10 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
15c20 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
15c30 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
15c40 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
15c50 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
15c60 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
15c70 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
15c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c90 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
15ca0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
15cb0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
15cc0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15cd0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
15ce0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
15cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15d00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
15d10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15d20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
15d30 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
15d40 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
15d50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
15d60 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
15d70 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
15d80 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
15d90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15da0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
15db0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
15dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
15dd0 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
15de0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
15df0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
15e00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
15e10 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
15e20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
15e30 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
15e40 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
15e50 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
15e60 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
15e70 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
15e80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15e90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
15ea0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15eb0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
15ec0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
15ed0 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
15ee0 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
15ef0 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
15f00 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
15f10 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20  /.    pBt->nRef 
15f20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 1;.    if( p->
15f30 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
15f40 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
15f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
15f60 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
15f70 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
15f80 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
15f90 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15fa0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15fb0 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
15fc0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
15fd0 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
15fe0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15ff0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
16000 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
16010 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
16020 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
16030 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
16040 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
16050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
16070 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
16080 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
16090 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
160a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
160b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
160c0 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
160d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
160e0 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
160f0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16100 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
16110 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
16120 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16130 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
16140 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
16150 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
16160 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
16170 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
16180 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16190 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
161a0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
161b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
161c0 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
161d0 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
161e0 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
161f0 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
16200 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
16210 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
16220 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
16230 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
16240 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
16250 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
16260 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
16270 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
16280 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
16290 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
162a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
162b0 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
162c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
162d0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
162e0 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
162f0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
16300 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
16310 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
16320 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
16330 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
16340 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
16350 20 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70       if( (uptr)p
16360 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62  ->pBt<(uptr)pSib
16370 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
16380 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
16390 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
163a0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
163b0 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
163c0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
163d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
163e0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
163f0 78 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62  xt && (uptr)pSib
16400 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70  ->pNext->pBt<(up
16410 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  tr)p->pBt ){.   
16420 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
16430 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
16440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16450 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
16460 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
16470 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
16480 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
16490 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
164a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
164b0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
164c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
164d0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
164e0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
164f0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
16500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
16520 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
16530 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
16540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16550 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
16560 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
16570 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16580 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
16590 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
165a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
165b0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
165c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
165d0 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
165e0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
165f0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a  3_file *pFile;..
16600 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
16610 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
16620 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
16630 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
16640 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
16650 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
16660 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
16670 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
16680 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
16690 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
166a0 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
166b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
166c0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
166d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
166e0 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
166f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
16700 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
16710 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
16720 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
16730 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
16740 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46  );.    }..    pF
16750 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
16760 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
16770 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  er);.    if( pFi
16780 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  le->pMethods ){.
16790 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
167a0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
167b0 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  File, SQLITE_FCN
167c0 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26  TL_PDB, (void*)&
167d0 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  pBt->db);.    }.
167e0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
167f0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
16800 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16810 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
16820 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
16830 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
16840 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73  xOpen);.  }.  as
16850 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16860 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  _OK || sqlite3Bt
16870 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  reeConnectionCou
16880 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29  nt(*ppBtree)>0 )
16890 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
168a0 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
168b0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
168c0 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
168d0 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
168e0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
168f0 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
16900 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
16910 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
16920 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
16930 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
16940 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
16950 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
16960 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
16970 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
16980 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16990 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
169a0 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
169b0 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
169c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
169d0 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
169e0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
169f0 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
16a00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
16a10 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
16a20 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
16a30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16a40 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
16a50 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
16a60 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
16a70 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16a80 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16a90 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
16aa0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16ab0 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
16ac0 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
16ad0 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
16ae0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
16af0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
16b00 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
16b10 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
16b20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
16b30 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16b40 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
16b50 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
16b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
16b70 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
16b80 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
16b90 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
16ba0 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
16bb0 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
16bc0 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
16bd0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
16be0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
16bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16c00 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
16c10 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
16c20 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
16c30 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
16c40 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
16c50 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
16c60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16c70 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
16c80 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
16c90 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
16ca0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16cb0 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
16cc0 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
16cd0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
16ce0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
16cf0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
16d00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
16d10 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
16d20 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
16d30 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
16d40 74 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74  tes with a 4-byt
16d50 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c  e prefix for a l
16d60 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69  eft-child.** poi
16d70 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
16d80 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
16d90 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
16da0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
16db0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16dc0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16dd0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
16de0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
16df0 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
16e00 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
16e10 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
16e20 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
16e30 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
16e40 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
16e50 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
16e60 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
16e70 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
16e80 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
16e90 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
16ea0 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
16eb0 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
16ec0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
16ed0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
16ee0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
16ef0 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
16f00 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
16f10 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
16f20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
16f30 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
16f40 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
16f50 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
16f60 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
16f70 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
16f80 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
16f90 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
16fa0 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
16fb0 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
16fc0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
16fd0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
16fe0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
16ff0 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
17000 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
17010 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
17020 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
17030 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
17040 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
17050 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
17060 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
17070 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
17080 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
17090 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20   space here..   
170a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a   **.    ** Also:
170b0 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62    Provide four b
170c0 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69  ytes of initiali
170d0 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65  zed space before
170e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69   the.    ** begi
170f0 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61  nning of pTmpSpa
17100 63 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76  ce as an area av
17110 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65  ailable to prepe
17120 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65  nd the.    ** le
17130 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ft-child pointer
17140 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
17150 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20  g of a cell..   
17160 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
17170 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
17180 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e      memset(pBt->
17190 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29  pTmpSpace, 0, 8)
171a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d  ;.      pBt->pTm
171b0 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20  pSpace += 4;.   
171c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
171d0 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54  Free the pBt->pT
171e0 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69  mpSpace allocati
171f0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
17200 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28  d freeTempSpace(
17210 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
17220 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
17230 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
17240 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b  >pTmpSpace -= 4;
17250 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17260 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70  Free(pBt->pTmpSp
17270 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ace);.    pBt->p
17280 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
17290 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
172a0 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
172b0 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
172c0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
172d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
172e0 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
172f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
17300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
17310 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
17320 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
17330 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
17340 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
17350 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17360 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17370 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17390 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d  ter(p);.  pCur =
173a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
173b0 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a   while( pCur ){.
173c0 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54      BtCursor *pT
173d0 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70  mp = pCur;.    p
173e0 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  Cur = pCur->pNex
173f0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d  t;.    if( pTmp-
17400 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
17410 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17420 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70  CloseCursor(pTmp
17430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17440 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  /* Rollback any 
17450 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
17460 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20  on and free the 
17470 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65  handle structure
17480 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  ..  ** The call 
17490 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  to sqlite3BtreeR
174a0 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20  ollback() drops 
174b0 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20  any table-locks 
174c0 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  held by.  ** thi
174d0 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20  s handle..  */. 
174e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
174f0 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f  lback(p, SQLITE_
17500 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
17510 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17520 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
17530 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
17540 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
17550 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
17560 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
17570 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
17580 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
17590 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
175a0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
175b0 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
175c0 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
175d0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
175e0 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
175f0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
17600 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
17610 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
17620 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
17630 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
17640 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
17650 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
17660 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
17670 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
17680 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
17690 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
176a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
176b0 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
176c0 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
176d0 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
176e0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
176f0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
17700 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
17710 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
17720 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  b);.    if( pBt-
17730 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
17740 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
17750 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
17760 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
17770 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
17780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
17790 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
177a0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
177b0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
177c0 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
177d0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
177e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
177f0 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
17800 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
17810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17820 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
17830 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
17840 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
17850 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
17860 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
17870 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
17880 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
17890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
178b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
178c0 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22  hange the "soft"
178d0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
178e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
178f0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55   the cache..** U
17900 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69  nused and unmodi
17910 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20  fied pages will 
17920 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e  be recycled when
17930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
17940 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  * pages in the c
17950 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69  ache exceeds thi
17960 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42  s soft limit.  B
17970 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ut the size of t
17980 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61  he.** cache is a
17990 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c  llowed to grow l
179a0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
179b0 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74  limit if it cont
179c0 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61  ains.** dirty pa
179d0 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69  ges or pages sti
179e0 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65  ll in active use
179f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17a00 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
17a10 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17a20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
17a30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17a40 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17a50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17a60 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17a70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17a80 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17a90 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
17aa0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17ab0 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
17ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17ad0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17ae0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17af0 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c  hange the "spill
17b00 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
17b10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17b20 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
17b30 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
17b40 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74   pages exceeds t
17b50 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67  his limit during
17b60 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
17b70 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67  tion,.** the pag
17b80 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74  er might attempt
17b90 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65   to "spill" page
17ba0 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
17bb0 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64   early in.** ord
17bc0 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
17bd0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
17be0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17bf0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  s the current sp
17c00 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65  ill size.  If ze
17c10 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20  ro is passed.** 
17c20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20  as an argument, 
17c30 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
17c40 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c  ade to the spill
17c50 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73   size setting, s
17c60 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67  o.** using mxPag
17c70 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20  e of 0 is a way 
17c80 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72  to query the cur
17c90 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e  rent spill size.
17ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17cb0 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65  treeSetSpillSize
17cc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17cd0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
17ce0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17cf0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
17d00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17d10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17d20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17d30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17d40 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  );.  res = sqlit
17d50 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73  e3PagerSetSpills
17d60 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17d70 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
17d80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17d90 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17da0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
17db0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
17dc0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
17dd0 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75  imit on the amou
17de0 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nt of the databa
17df0 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79  se file that may
17e00 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61   be.** memory ma
17e10 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pped..*/.int sql
17e20 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70  ite3BtreeSetMmap
17e30 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20  Limit(Btree *p, 
17e40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
17e50 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  Mmap){.  BtShare
17e60 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17e70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17e80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
17e90 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
17ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17eb0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
17ec0 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
17ed0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73  t(pBt->pPager, s
17ee0 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  zMmap);.  sqlite
17ef0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f10 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
17f20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
17f30 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
17f40 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
17f50 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
17f60 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
17f70 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
17f80 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
17f90 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
17fa0 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
17fb0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
17fc0 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
17fd0 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
17fe0 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
17ff0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
18000 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
18010 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
18020 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
18030 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
18040 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
18050 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
18060 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
18070 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
18080 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
18090 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
180a0 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
180b0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
180c0 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
180d0 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
180e0 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
180f0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
18100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
18110 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
18120 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
18130 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65  gerFlags(.  Btre
18140 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18150 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
18160 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
18170 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
18180 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
18190 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
181a0 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20  s PAGER_* flags 
181b0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
181c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
181d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
181e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
181f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
18200 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18210 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
18220 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
18230 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67  ->pPager, pgFlag
18240 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
18250 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18270 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18280 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
18290 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
182a0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
182b0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
182c0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
182d0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
182e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
182f0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
18300 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
18310 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
18320 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
18330 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
18340 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
18350 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
18360 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
18370 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
18380 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
18390 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
183a0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
183b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
183c0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
183d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
183e0 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
183f0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
18400 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
18410 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
18420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18430 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
18440 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
18450 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
18460 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
18470 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
18480 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
18490 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
184a0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
184b0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
184c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
184d0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
184e0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
184f0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
18500 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
18510 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
18520 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
18530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
18540 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
18550 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
18560 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
18570 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
18580 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
18590 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
185a0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
185b0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
185c0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
185d0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
185e0 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
185f0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
18600 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
18610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
18620 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18630 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18640 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
18650 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
18660 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18670 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
18680 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
18690 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
186a0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
186b0 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
186c0 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
186d0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
186e0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
186f0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
18700 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
18710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18720 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
18730 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18740 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
18750 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
18760 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
18770 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
18780 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
18790 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
187a0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
187b0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
187c0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
187d0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
187e0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
187f0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
18800 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
18810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
18820 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18830 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
18840 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
18850 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
18860 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
18870 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
18880 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
18890 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
188a0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
188b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
188c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
188d0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
188e0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
188f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
18900 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
18910 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
18920 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
18930 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
18940 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18950 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
18970 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
18980 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
18990 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
189a0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
189b0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
189c0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
189d0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
189e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
189f0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
18a00 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18a10 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
18a20 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
18a30 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
18a40 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
18a50 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
18a60 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
18a70 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
18a80 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
18a90 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
18aa0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
18ab0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
18ac0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
18ad0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
18ae0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
18af0 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
18b00 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
18b10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
18b20 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
18b30 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
18b40 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
18b50 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
18b60 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
18b70 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
18b80 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
18b90 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
18ba0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
18bb0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
18bc0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
18bd0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
18be0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18bf0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
18c00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
18c10 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
18c20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18c30 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
18c40 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
18c50 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
18c60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
18c70 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
18c80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18c90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18ca0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
18cb0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
18cc0 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
18cd0 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
18ce0 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
18cf0 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
18d00 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
18d10 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
18d20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
18d30 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
18d40 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
18d50 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
18d60 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
18d70 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
18d80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
18d90 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
18da0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
18db0 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
18dc0 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
18dd0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
18de0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
18df0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
18e00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18e10 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
18e20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
18e30 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
18e40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18e50 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
18e60 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
18e70 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
18e80 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
18e90 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
18ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18eb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
18ec0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
18ed0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
18ee0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
18ef0 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
18f00 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
18f10 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
18f20 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
18f30 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
18f40 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
18f50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
18f60 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
18f70 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18f80 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
18f90 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
18fa0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
18fb0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
18fc0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
18fd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
18fe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
18ff0 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
19000 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
19010 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
19020 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
19030 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
19040 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
19050 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
19060 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
19070 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
19080 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
19090 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
190a0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
190b0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
190c0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
190d0 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
190e0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
190f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19100 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
19110 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
19120 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
19130 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
19140 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
19150 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19160 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
19170 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
19180 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
19190 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
191a0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
191b0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
191c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
191d0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
191e0 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
191f0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
19200 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
19210 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19220 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19230 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
19240 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
19250 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
19260 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
19270 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
19280 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
19290 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
192a0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
192b0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
192c0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
192d0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
192e0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
192f0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
19300 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
19310 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19320 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
19330 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
19340 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
19350 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
19360 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
19370 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
19380 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19390 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
193a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
193b0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
193c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
193d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
193e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
193f0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
19400 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
19410 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19420 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
19430 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
19440 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
19450 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
19460 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
19470 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19480 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
19490 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
194a0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
194b0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
194c0 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
194d0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
194e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
194f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
19500 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
19510 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
19520 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
19530 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
19540 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
19550 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
19560 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19570 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
19580 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
19590 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
195a0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
195b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
195c0 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
195d0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
195e0 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
195f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
19600 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19610 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
19620 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
19630 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
19640 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
19650 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
19660 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
19670 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
19680 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
19690 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
196a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
196b0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
196c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
196d0 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
196e0 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
196f0 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
19700 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
19710 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
19720 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
19730 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
19740 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
19750 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
19760 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
19770 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
19780 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
19790 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
197a0 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
197b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
197c0 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
197d0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
197e0 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 74 61 74 69  YNCHRONOUS.stati
197f0 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
19800 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
19810 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
19820 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
19830 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
19840 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
19850 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
19860 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
19870 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
19880 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
19890 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
198a0 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
198b0 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
198c0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
198d0 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
198e0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
198f0 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
19900 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
19910 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
19920 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
19930 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
19940 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
19950 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
19960 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
19970 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
19980 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
19990 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
199a0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
199b0 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
199c0 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
199d0 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
199e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ndif../*.** Get 
199f0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
19a00 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
19a10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
19a20 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
19a30 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
19a40 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
19a50 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
19a60 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
19a70 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
19a80 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
19a90 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
19aa0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
19ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19ac0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
19ad0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
19ae0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
19af0 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
19b00 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
19b10 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
19b20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
19b30 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
19b40 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
19b50 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
19b60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
19b70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
19b80 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
19b90 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
19ba0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
19bb0 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
19bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19bd0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
19be0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
19bf0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
19c00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
19c10 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
19c20 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
19c30 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19c40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19c50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
19c60 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
19c70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19c80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
19c90 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
19ca0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
19cb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19cc0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19cd0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
19ce0 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
19cf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19d00 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
19d10 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
19d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19d30 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
19d40 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
19d50 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
19d60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19d70 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19d80 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
19d90 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
19da0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
19db0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
19dc0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
19dd0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
19de0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
19df0 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
19e00 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
19e10 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
19e20 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19e30 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
19e40 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
19e50 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
19e60 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
19e70 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
19e80 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
19e90 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
19ea0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
19eb0 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
19ec0 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
19ed0 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
19ee0 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
19ef0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
19f00 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
19f10 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
19f20 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
19f30 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19f40 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
19f50 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
19f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
19f70 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
19f80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
19f90 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
19fa0 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
19fb0 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
19fc0 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
19fd0 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
19fe0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
19ff0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
1a000 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
1a010 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a020 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
1a030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1a040 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
1a050 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
1a060 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1a070 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1a080 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1a090 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
1a0a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a0b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a0c0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
1a0d0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
1a0e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
1a0f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
1a100 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
1a110 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
1a120 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
1a130 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a140 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
1a150 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
1a160 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
1a170 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
1a180 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
1a190 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
1a1a0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
1a1b0 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
1a1c0 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
1a1d0 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
1a1e0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
1a1f0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
1a200 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
1a210 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
1a220 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
1a230 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
1a240 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
1a250 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
1a260 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
1a270 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
1a280 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
1a290 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
1a2a0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
1a2b0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
1a2c0 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
1a2d0 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
1a2e0 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
1a2f0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
1a300 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1a310 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
1a320 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
1a330 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
1a340 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
1a350 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
1a360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a370 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
1a380 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
1a390 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
1a3a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a3b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
1a3c0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a3e0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
1a3f0 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
1a400 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
1a410 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
1a420 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
1a430 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1a440 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a450 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
1a460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a470 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
1a480 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1a490 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
1a4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a4b0 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a4c0 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1a4d0 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
1a4e0 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65  OUS+1);.    }.#e
1a4f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
1a500 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
1a510 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
1a520 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
1a530 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
1a540 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
1a550 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
1a560 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
1a570 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
1a580 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
1a590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1a5a0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
1a5b0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
1a5c0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
1a5d0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
1a5e0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
1a5f0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
1a600 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
1a610 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
1a620 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
1a630 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
1a640 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
1a650 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a660 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1a670 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a680 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
1a690 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
1a6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a6b0 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
1a6c0 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
1a6d0 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
1a6e0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
1a6f0 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
1a700 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
1a710 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
1a720 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1a730 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
1a740 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
1a750 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
1a760 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a770 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
1a780 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
1a790 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
1a7a0 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
1a7b0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
1a7c0 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
1a7d0 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
1a7e0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
1a7f0 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
1a800 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1a810 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
1a820 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
1a830 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
1a840 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a850 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a860 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
1a870 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
1a880 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a890 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
1a8a0 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
1a8b0 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
1a8c0 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
1a8d0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
1a8e0 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
1a8f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
1a900 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
1a910 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
1a920 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
1a930 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
1a940 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
1a950 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
1a960 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
1a970 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
1a980 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
1a990 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
1a9a0 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
1a9b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
1a9c0 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
1a9d0 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
1a9e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a9f0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
1aa00 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
1aa10 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
1aa20 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
1aa30 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
1aa40 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
1aa50 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
1aa60 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
1aa70 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1aa80 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
1aa90 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
1aaa0 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
1aab0 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
1aac0 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
1aad0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
1aae0 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
1aaf0 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
1ab00 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
1ab10 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
1ab20 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
1ab30 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
1ab40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
1ab50 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
1ab60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1ab70 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
1ab80 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
1ab90 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
1aba0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
1abb0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1abc0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1abd0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1abe0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1abf0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1ac00 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1ac10 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1ac20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ac30 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1ac40 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1ac50 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ac80 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1ac90 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1aca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1acb0 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
1acc0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
1acd0 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
1ace0 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
1acf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ad00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ad10 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
1ad20 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1ad30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1ad40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
1ad50 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
1ad60 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
1ad70 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
1ad80 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
1ad90 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
1ada0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
1adb0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
1adc0 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
1add0 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
1ade0 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
1adf0 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
1ae00 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
1ae10 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
1ae20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1ae30 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1ae40 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
1ae50 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1ae60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1ae70 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
1ae80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ae90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1aea0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1aeb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1aec0 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
1aed0 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
1aee0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
1aef0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1af00 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
1af10 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
1af20 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
1af30 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
1af40 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
1af50 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
1af60 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
1af70 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
1af80 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
1af90 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
1afa0 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
1afb0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
1afc0 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
1afd0 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
1afe0 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
1aff0 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
1b000 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
1b010 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
1b020 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
1b030 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
1b040 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
1b050 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
1b060 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
1b070 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1b080 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
1b090 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1b0a0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
1b0b0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
1b0c0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
1b0d0 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
1b0e0 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
1b0f0 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
1b100 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
1b110 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
1b120 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
1b130 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
1b140 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
1b150 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
1b160 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
1b170 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
1b180 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1b190 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
1b1a0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
1b1b0 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
1b1c0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1b1d0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
1b1e0 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
1b1f0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
1b200 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
1b210 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
1b220 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1b230 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1b240 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
1b250 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
1b260 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
1b270 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
1b280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
1b290 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1b2a0 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
1b2b0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
1b2c0 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
1b2d0 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
1b2e0 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
1b2f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
1b300 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
1b310 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1b320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b330 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
1b340 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
1b350 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
1b360 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1b370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1b380 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1b390 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1b3a0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1b3b0 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1b3c0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1b3d0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1b3e0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1b3f0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1b400 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1b410 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1b420 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1b430 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1b440 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1b450 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1b460 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1b470 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1b480 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1b490 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1b4a0 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1b4b0 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1b4c0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1b4d0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1b4e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1b4f0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1b500 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1b510 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1b520 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1b530 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1b540 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1b550 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b560 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1b570 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1b580 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1b590 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1b5a0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1b5b0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1b5c0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1b5d0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1b5e0 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1b5f0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1b600 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1b610 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1b620 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1b630 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1b640 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1b650 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1b660 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1b670 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1b680 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1b690 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1b6a0 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1b6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1b6c0 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1b6d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b6e0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1b6f0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1b700 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1b710 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b720 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1b730 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1b740 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1b750 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1b760 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1b770 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1b780 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1b790 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1b7a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b7b0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1b7c0 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1b7d0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1b7e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b7f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b800 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1b810 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1b820 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1b830 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1b840 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1b850 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b860 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1b870 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1b880 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1b890 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1b8a0 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1b8b0 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1b8c0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1b8d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1b8e0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1b8f0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1b900 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1b910 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
1b920 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
1b930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1b940 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1b950 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1b960 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1b970 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1b980 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1b990 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1b9a0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1b9b0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1b9c0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1b9d0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1b9e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1b9f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1ba00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ba10 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1ba20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1ba30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ba40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1ba50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1ba60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ba70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ba80 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1ba90 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1baa0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1bab0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1bac0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bad0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1bae0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1baf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1bb00 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1bb10 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1bb20 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1bb30 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1bb40 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1bb50 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1bb60 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1bb70 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1bb80 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1bb90 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1bba0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1bbb0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1bbc0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1bbd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1bbe0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1bbf0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1bc00 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1bc10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1bc20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1bc30 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1bc40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc50 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1bc60 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1bc70 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1bc80 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1bc90 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1bca0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1bcb0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1bcc0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1bcd0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1bce0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1bcf0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1bd00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1bd20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1bd30 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1bd40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1bd50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bd60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1bd70 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1bd80 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1bd90 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1bda0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1bdb0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1bdc0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1bdd0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1bde0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1bdf0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1be00 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1be10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1be20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1be30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1be40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1be50 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1be60 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1be70 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1be80 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1be90 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1bea0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1beb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1bec0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1bed0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1bee0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1bef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bf00 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1bf10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1bf20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bf30 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1bf40 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1bf50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1bf60 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1bf70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bf80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf90 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1bfa0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1bfb0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1bfc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1bfd0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1bfe0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1bff0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1c000 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1c010 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1c020 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1c030 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1c040 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1c050 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1c060 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1c070 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1c080 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1c090 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1c0a0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1c0b0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1c0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1c0d0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1c0e0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1c0f0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1c100 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1c110 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1c120 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1c130 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1c140 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c150 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1c160 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c170 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c180 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1c190 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c1b0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1c1c0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1c1d0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1c1e0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1c1f0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1c200 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1c210 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1c220 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1c230 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1c240 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1c250 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c260 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1c270 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c280 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1c290 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c2a0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1c2b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1c2c0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1c2d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1c2e0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1c2f0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1c300 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1c310 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1c320 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1c330 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1c340 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1c350 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1c360 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1c370 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c380 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1c390 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1c3a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1c3b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1c3c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1c3d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c3e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1c3f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1c400 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1c410 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1c420 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c430 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1c440 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1c450 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1c460 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1c470 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1c480 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1c490 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1c4a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1c4b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1c4c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1c4d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1c4e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1c4f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1c500 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1c510 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1c520 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1c530 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1c540 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1c550 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1c560 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1c570 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1c580 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1c590 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1c5a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1c5b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1c5c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1c5d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1c5e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1c5f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1c600 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1c610 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1c620 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c630 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1c640 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1c650 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1c660 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c670 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c680 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 43  ITE_OK;.  int bC
1c690 6f 6e 63 75 72 72 65 6e 74 20 3d 20 28 70 2d 3e  oncurrent = (p->
1c6a0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
1c6b0 26 26 20 21 49 53 41 55 54 4f 56 41 43 55 55 4d  && !ISAUTOVACUUM
1c6c0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  );..  sqlite3Btr
1c6d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1c6e0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c6f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1c700 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1c710 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1c720 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1c730 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1c740 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1c750 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1c760 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1c770 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1c780 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1c790 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1c7a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c7b0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1c7c0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1c7d0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1c7e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1c7f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c800 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c810 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1c820 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1c830 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1c840 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1c850 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1c860 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1c870 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1c880 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1c890 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c8a0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1c8b0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1c8c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c8d0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1c8e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1c8f0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1c900 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1c910 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1c920 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1c930 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1c940 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1c950 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1c960 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1c970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1c980 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1c990 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1c9a0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1c9b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1c9c0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1c9d0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1c9e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1c9f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1ca00 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1ca10 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ca20 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1ca30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1ca40 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1ca50 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1ca60 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1ca70 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1ca80 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1ca90 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1caa0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1cab0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1cac0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1cad0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1cae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1caf0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1cb00 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1cb10 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1cb20 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1cb30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cb40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cb50 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1cb60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1cb70 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1cb80 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1cb90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cba0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1cbb0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1cbc0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1cbd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1cbe0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1cbf0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1cc00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1cc10 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1cc20 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1cc30 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1cc40 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1cc50 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1cc60 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1cc70 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1cc80 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1cc90 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1cca0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1ccb0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1ccc0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1ccd0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1cce0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1ccf0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1cd00 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1cd10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1cd20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1cd30 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1cd40 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1cd50 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1cd60 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1cd70 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1cd80 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1cd90 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1cda0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1cdb0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1cdc0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1cdd0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1cde0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1cdf0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1ce00 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1ce10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1ce20 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1ce30 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1ce40 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1ce50 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1ce60 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1ce70 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1ce80 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1ce90 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1cea0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1ceb0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1cec0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1ced0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1cee0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1cef0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1cf00 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1cf10 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1cf20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1cf30 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1cf40 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1cf50 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1cf60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cf70 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1cf80 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1cf90 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1cfa0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1cfb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1cfc0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1cfd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1cfe0 20 65 78 46 6c 61 67 20 3d 20 62 43 6f 6e 63 75   exFlag = bConcu
1cff0 72 72 65 6e 74 20 3f 20 2d 31 20 3a 20 28 77 72  rrent ? -1 : (wr
1d000 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20  flag>1);.       
1d010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d020 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1d030 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 73 71 6c  ger, exFlag, sql
1d040 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1d050 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1d060 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d080 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1d090 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1d0a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d0b0 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
1d0c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d0d0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1d0e0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1d0f0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
1d100 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
1d110 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
1d120 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d130 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
1d140 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
1d150 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
1d160 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1d180 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d190 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d1a0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1d1b0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1d1c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1d1d0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1d1e0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1d1f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d200 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1d210 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1d220 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1d230 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1d240 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1d250 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1d260 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1d270 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1d280 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1d290 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d2a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1d2b0 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1d2c0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1d2d0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1d2e0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1d2f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1d300 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1d310 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1d320 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1d330 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1d340 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1d350 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1d360 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1d370 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d380 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1d390 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1d3a0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1d3b0 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1d3c0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1d3d0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1d3e0 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1d3f0 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1d400 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1d410 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1d420 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d430 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1d440 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1d450 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1d460 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1d470 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1d480 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1d490 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1d4a0 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1d4b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1d4c0 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1d4d0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1d4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d4f0 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1d500 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1d510 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1d520 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1d530 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1d540 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1d550 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1d560 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1d570 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1d580 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d590 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1d5a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d5b0 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1d5c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d5d0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1d5e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1d5f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d610 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d620 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1d630 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1d640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d650 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
1d660 73 5f 62 65 67 75 6e 3a 0a 23 69 66 6e 64 65 66  s_begun:.#ifndef
1d670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e   SQLITE_OMIT_CON
1d680 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 62 43  CURRENT.  if( bC
1d690 6f 6e 63 75 72 72 65 6e 74 20 26 26 20 72 63 3d  oncurrent && rc=
1d6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
1d6b0 6c 69 74 65 33 50 61 67 65 72 49 73 57 61 6c 28  lite3PagerIsWal(
1d6c0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1d6d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d6e0 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75 72  PagerBeginConcur
1d6f0 72 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rent(pBt->pPager
1d700 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1d720 61 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ag ){.      rc =
1d730 20 62 74 72 65 65 50 74 72 6d 61 70 41 6c 6c 6f   btreePtrmapAllo
1d740 63 61 74 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  cate(pBt);.    }
1d750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1d760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d770 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1d780 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1d790 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1d7a0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1d7b0 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1d7c0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1d7d0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1d7e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1d7f0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1d800 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1d810 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1d820 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1d830 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1d840 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1d850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1d860 20 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   nSavepoint = p-
1d870 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
1d880 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d890 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1d8a0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1d8b0 20 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   nSavepoint);.  
1d8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d8d0 5f 4f 4b 20 26 26 20 6e 53 61 76 65 70 6f 69 6e  _OK && nSavepoin
1d8e0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1d8f0 62 74 72 65 65 50 74 72 6d 61 70 42 65 67 69 6e  btreePtrmapBegin
1d900 28 70 42 74 2c 20 6e 53 61 76 65 70 6f 69 6e 74  (pBt, nSavepoint
1d910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d920 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1d930 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d940 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1d960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d970 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1d980 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1d990 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1d9a0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1d9b0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1d9c0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1d9d0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1d9e0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1d9f0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1da00 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1da10 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1da20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1da30 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1da40 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1da50 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1da60 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1da70 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da90 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1daa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1dab0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1dac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dad0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1dae0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1daf0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1db20 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1db30 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1db40 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1db50 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1db60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1db70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1db80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1db90 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
1dba0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1dbb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dbc0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1dbd0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1dbe0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1dbf0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1dc00 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1dc10 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1dc20 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1dc30 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1dc40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1dc50 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1dc60 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1dc70 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1dc80 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1dc90 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1dca0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1dcb0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1dcc0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1dcd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1dce0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1dcf0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1dd00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1dd10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1dd20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1dd30 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1dd40 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1dd50 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1dd60 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1dd70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dd80 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1dd90 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1dda0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1ddb0 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1ddc0 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1ddd0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1dde0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1ddf0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1de00 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1de10 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1de20 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1de30 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1de40 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1de50 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1de60 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1de70 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1de80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1de90 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1dea0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1deb0 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1dec0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1ded0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1dee0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1def0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1df00 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1df10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1df20 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1df30 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1df40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1df50 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1df60 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1df70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1df80 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1dfa0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dfb0 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1dfc0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1dfd0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1dfe0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1dff0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1e000 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1e010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1e020 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1e030 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1e050 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1e060 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1e070 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1e080 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e090 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1e0a0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1e0b0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1e0c0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1e0d0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1e0e0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1e0f0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1e100 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e130 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
1e140 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
1e150 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e160 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1e170 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1e180 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
1e190 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1e1a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e1b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1e1c0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1e1d0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1e1e0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1e1f0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1e200 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1e210 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1e220 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1e230 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1e240 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1e250 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1e260 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1e270 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1e280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1e290 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1e2a0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
1e2b0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b        if( pCell+
1e2c0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61  info.nSize > pPa
1e2d0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
1e2e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1e2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e310 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e330 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1e340 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1e350 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1e360 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1e370 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1e380 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1e390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e3a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e3b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1e3c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1e3d0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1e3e0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1e3f0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1e400 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1e410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e420 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e430 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1e440 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1e450 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1e460 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1e470 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1e480 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1e490 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1e4a0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e4b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e4c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1e4e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1e4f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1e500 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1e510 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1e530 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1e540 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1e550 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1e560 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1e570 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1e580 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1e590 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1e5a0 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1e5b0 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1e5c0 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1e5d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1e5e0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1e5f0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1e600 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1e610 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1e620 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1e630 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1e640 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1e650 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1e660 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1e670 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1e680 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1e690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1e6a0 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1e6b0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1e6c0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1e6d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1e6e0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1e6f0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1e700 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1e730 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1e740 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1e750 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1e760 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e770 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1e780 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1e790 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1e7a0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1e7b0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1e7c0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1e7d0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1e7e0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1e7f0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1e800 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1e810 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1e820 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1e830 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1e840 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1e850 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1e860 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1e870 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1e880 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1e890 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e8a0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1e8b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1e8c0 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1e8d0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1e8e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e8f0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1e900 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1e910 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1e920 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1e930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e950 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1e960 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1e970 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1e980 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1e990 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1e9a0 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1e9b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1e9c0 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1e9d0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1e9e0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1e9f0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1ea00 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1ea10 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1ea20 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1ea30 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1ea40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ea50 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1ea60 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1ea70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1ea80 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1ea90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eaa0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1eab0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1eac0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1ead0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1eae0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1eaf0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1eb00 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1eb10 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1eb20 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1eb30 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1eb40 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1eb50 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1eb60 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1eb70 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1eb80 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1eb90 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1eba0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1ebb0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1ebc0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1ebd0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1ebe0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1ebf0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ec00 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1ec10 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1ec20 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1ec30 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1ec40 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1ec50 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1ec60 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1ec70 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1ec80 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1ec90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1eca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1ecb0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1ecc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ecd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ece0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ecf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ed00 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1ed10 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1ed20 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1ed30 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1ed40 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1ed50 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1ed60 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1ed70 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1ed80 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1ed90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1eda0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1edb0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1edc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1edd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1ede0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1edf0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1ee00 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1ee10 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1ee20 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1ee30 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1ee40 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1ee50 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1ee60 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1ee70 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1ee80 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1ee90 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1eea0 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1eeb0 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1eec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1eee0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1eef0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ef00 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1ef10 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1ef20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ef30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1ef40 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1ef50 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ef60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1ef70 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1ef80 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1ef90 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1efa0 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1efb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1efc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1efd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1efe0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1eff0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1f000 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1f010 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1f020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f030 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1f040 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1f050 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1f060 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1f070 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1f080 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1f090 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1f0a0 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1f0b0 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1f0c0 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1f0d0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1f0e0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1f0f0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1f100 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1f110 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1f120 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1f130 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1f140 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1f150 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1f160 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1f170 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1f180 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1f190 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1f1a0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1f1b0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1f1c0 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1f1d0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1f1e0 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1f1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1f200 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1f210 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1f220 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1f230 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1f240 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1f250 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1f260 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1f270 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1f280 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1f290 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1f2a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1f2b0 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1f2c0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1f2d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1f2e0 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1f2f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1f300 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1f310 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1f320 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1f330 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1f340 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1f350 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1f360 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1f370 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1f380 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1f390 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1f3a0 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1f3b0 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1f3c0 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1f3d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f3e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1f3f0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1f400 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1f410 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1f420 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1f430 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1f440 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1f450 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1f460 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1f470 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1f480 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1f490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f4a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1f4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1f4c0 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1f4d0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1f4e0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1f4f0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1f500 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f510 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1f520 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1f530 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1f540 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1f550 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f560 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1f570 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1f580 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f590 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1f5a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1f5b0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1f5c0 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1f5d0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1f5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f5f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1f600 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1f610 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1f620 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1f630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f640 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f650 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1f660 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1f670 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1f680 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1f690 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1f6a0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1f6b0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1f6c0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1f6d0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1f6e0 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1f6f0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1f700 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1f710 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1f720 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1f730 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1f740 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1f750 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1f760 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1f770 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1f780 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1f790 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1f7a0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1f7b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1f7c0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1f7d0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f7e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f7f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f800 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f810 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1f820 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1f830 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1f840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f850 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f860 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1f870 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1f880 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1f890 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1f8a0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1f8b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1f8c0 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1f8d0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1f8e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1f8f0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1f900 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1f910 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1f920 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1f930 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1f940 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1f950 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1f960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1f970 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1f980 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1f990 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1f9a0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1f9b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1f9c0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1f9d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1f9e0 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1f9f0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1fa00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1fa20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1fa30 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1fa40 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1fa50 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1fa60 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1fa70 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1fa80 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1fa90 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1faa0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1fab0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1fac0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1fad0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1fae0 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1faf0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1fb00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1fb10 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1fb20 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1fb30 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1fb40 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1fb50 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1fb60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1fb70 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1fb80 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1fb90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1fba0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1fbb0 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1fbc0 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1fbd0 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1fbe0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1fbf0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1fc00 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1fc10 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1fc20 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1fc30 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1fc40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1fc70 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1fc80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fca0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1fcb0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1fcc0 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1fcd0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1fce0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1fcf0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1fd00 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1fd10 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1fd20 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1fd30 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1fd40 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1fd50 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1fd60 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1fd70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fd80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fd90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fda0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1fdb0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1fdc0 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1fdd0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1fde0 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1fdf0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1fe00 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1fe10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fe20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1fe30 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1fe40 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1fe50 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1fe60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1fe70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fe80 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1fe90 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1fea0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1feb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1fec0 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1fed0 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1fee0 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1fef0 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1ff00 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1ff10 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1ff20 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1ff30 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1ff40 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1ff50 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1ff60 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1ff70 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1ff80 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1ff90 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1ffa0 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ffc0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1ffd0 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1ffe0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1fff0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
20000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20010 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
20020 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
20030 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
20060 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
20070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
20080 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
20090 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
200a0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
200b0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
200c0 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
200d0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
200e0 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
200f0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
20100 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
20110 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
20120 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20130 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
20140 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
20150 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
20160 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
20170 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20180 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
20190 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
201a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
201b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
201c0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
201d0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
201e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
201f0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
20200 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
20210 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
20220 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
20230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
20240 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
20250 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
20260 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
20270 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
20280 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
20290 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
202a0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
202b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
202c0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
202d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
202e0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
202f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
20300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20310 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
20320 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
20330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20340 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
20350 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20360 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
20370 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20380 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
20390 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
203a0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
203b0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
203c0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
203d0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
203e0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
203f0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
20400 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
20410 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
20420 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20430 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
20440 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
20450 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
20460 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
20470 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
20480 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
20490 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
204a0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
204b0 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
204c0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
204d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
204e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
204f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20500 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
20510 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
20520 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
20530 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
20540 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
20550 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
20560 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
20570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20590 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
205a0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
205b0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
205c0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
205d0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
205e0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
205f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20600 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20610 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
20620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20630 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
20640 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20650 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
20660 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
20670 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20680 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
20690 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
206a0 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
206b0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
206c0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
206d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
206e0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
206f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
20700 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
20710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20720 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
20730 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
20740 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
20750 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
20760 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
20770 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
20780 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
20790 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
207a0 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
207b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
207c0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
207d0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
207e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
207f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
20800 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
20810 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
20820 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
20830 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20840 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
20850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20860 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
20870 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
20880 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
20890 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
208a0 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
208b0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
208c0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
208d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
208e0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
208f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
20900 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
20910 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
20920 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
20930 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20940 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
20950 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
20960 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
20970 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
20980 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
20990 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
209a0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
209b0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
209c0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
209d0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
209e0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
209f0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
20a00 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
20a10 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
20a20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
20a30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
20a40 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
20a50 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
20a60 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
20a70 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
20a80 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
20a90 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
20aa0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
20ab0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
20ac0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
20ad0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
20ae0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
20af0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
20b00 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
20b10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20b20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20b30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
20b40 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
20b50 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
20b60 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
20b70 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
20b80 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
20b90 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
20ba0 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
20bb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20bc0 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
20bd0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
20be0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
20bf0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20c00 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
20c10 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
20c20 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
20c30 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
20c40 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
20c50 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
20c60 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
20c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
20c80 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
20c90 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
20ca0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
20cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20cc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
20cd0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
20ce0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
20cf0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20d00 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
20d10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20d20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20d30 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
20d40 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20d50 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
20d60 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
20d70 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
20d80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
20d90 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
20da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
20db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20dc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20dd0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
20de0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
20df0 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
20e00 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
20e10 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
20e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
20e30 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
20e40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20e50 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
20e60 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
20e70 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
20e80 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
20e90 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
20ea0 52 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RENT./*.** This 
20eb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20ec0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 6d 65  ed as part of me
20ed0 72 67 69 6e 67 20 61 6e 20 43 4f 4e 43 55 52 52  rging an CONCURR
20ee0 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ENT transaction 
20ef0 77 69 74 68 0a 2a 2a 20 74 68 65 20 73 6e 61 70  with.** the snap
20f00 73 68 6f 74 20 61 74 20 74 68 65 20 68 65 61 64  shot at the head
20f10 20 6f 66 20 74 68 65 20 77 61 6c 20 66 69 6c 65   of the wal file
20f20 2e 20 49 74 20 72 65 6c 6f 63 61 74 65 73 20 61  . It relocates a
20f30 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 0a  ll pages in the.
20f40 2a 2a 20 72 61 6e 67 65 20 69 46 69 72 73 74 2e  ** range iFirst.
20f50 2e 69 4c 61 73 74 2c 20 69 6e 63 6c 75 73 69 76  .iLast, inclusiv
20f60 65 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  e. It is assumed
20f70 20 74 68 61 74 20 74 68 65 20 42 74 72 65 65 50   that the BtreeP
20f80 74 72 6d 61 70 20 0a 2a 2a 20 73 74 72 75 63 74  trmap .** struct
20f90 75 72 65 20 61 74 20 42 74 53 68 61 72 65 64 2e  ure at BtShared.
20fa0 70 4d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74 68  pMap contains th
20fb0 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
20fc0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 65 61  e pointers to ea
20fd0 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  ch.** page in th
20fe0 65 20 72 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  e range..**.** I
20ff0 66 20 70 6e 43 75 72 72 65 6e 74 20 69 73 20 4e  f pnCurrent is N
21000 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ULL, then all pa
21010 67 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ges in the range
21020 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 63 75   are moved to cu
21030 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 72 65 65 20  rrently.** free 
21040 6c 6f 63 61 74 69 6f 6e 73 20 28 69 2e 65 2e 20  locations (i.e. 
21050 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65  free-list entrie
21060 73 29 20 77 69 74 68 69 6e 20 74 68 65 20 64 61  s) within the da
21070 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
21080 72 65 20 70 61 67 65 0a 2a 2a 20 69 46 69 72 73  re page.** iFirs
21090 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
210a0 70 6e 43 75 72 72 65 6e 74 20 69 73 20 6e 6f 74  pnCurrent is not
210b0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 70   NULL, then it p
210c0 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 75 65  oints to a value
210d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
210e0 2a 2a 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  ** current size 
210f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21100 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
21110 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c 6c  n this case, all
21120 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 72 65   pages are.** re
21130 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 65  located to the e
21140 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
21150 73 65 20 66 69 6c 65 20 2d 20 70 61 67 65 20 69  se file - page i
21160 46 69 72 73 74 20 69 73 20 72 65 6c 6f 63 61 74  First is relocat
21170 65 64 20 74 6f 0a 2a 2a 20 70 61 67 65 20 28 2a  ed to.** page (*
21180 70 6e 43 75 72 72 65 6e 74 2b 31 29 2c 20 70 61  pnCurrent+1), pa
21190 67 65 20 69 46 69 72 73 74 2b 31 20 74 6f 20 70  ge iFirst+1 to p
211a0 61 67 65 20 28 2a 70 6e 43 75 72 72 65 6e 74 2b  age (*pnCurrent+
211b0 32 29 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 2a  2), and so on..*
211c0 2a 20 56 61 6c 75 65 20 2a 70 6e 43 75 72 72 65  * Value *pnCurre
211d0 6e 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nt is set to the
211e0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
211f0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
21200 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
21210 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a  on returns..**.*
21220 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
21230 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
21240 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
21250 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
21260 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21270 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
21280 65 52 65 6c 6f 63 61 74 65 52 61 6e 67 65 28 0a  eRelocateRange(.
21290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 61 6e 64    /* B-tree hand
212c0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 69  le */.  Pgno iFi
212d0 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
212e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
212f0 20 70 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74   page to relocat
21300 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4c 61 73  e */.  Pgno iLas
21310 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21320 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
21330 61 67 65 20 74 6f 20 72 65 6c 6f 63 61 74 65 20  age to relocate 
21340 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 6e 43 75 72  */.  Pgno *pnCur
21350 72 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  rent            
21360 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
21370 55 4c 4c 2c 20 49 4e 2f 4f 55 54 3a 20 44 61 74  ULL, IN/OUT: Dat
21380 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 29 7b  abase size */.){
21390 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
213a0 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 50 74  TE_OK;.  BtreePt
213b0 72 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74  rmap *pMap = pBt
213c0 2d 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69  ->pMap;.  Pgno i
213d0 50 67 3b 0a 0a 20 20 66 6f 72 28 69 50 67 3d 69  Pg;..  for(iPg=i
213e0 46 69 72 73 74 3b 20 69 50 67 3c 3d 69 4c 61 73  First; iPg<=iLas
213f0 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
21400 4f 4b 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  OK; iPg++){.    
21410 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 20 3d  MemPage *pFree =
21420 20 30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20   0;     /* Page 
21430 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 66  allocated from f
21440 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ree-list */.    
21450 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
21460 3b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 3b  ;.    Pgno iNew;
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21480 20 4e 65 77 20 70 61 67 65 20 6e 75 6d 62 65 72   New page number
21490 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 20 20   for pPg */.    
214a0 50 74 72 6d 61 70 45 6e 74 72 79 20 2a 70 45 6e  PtrmapEntry *pEn
214b0 74 72 79 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  try;    /* Point
214c0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
214d0 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 0a 20 20   page iPg */..  
214e0 20 20 69 66 28 20 69 50 67 3d 3d 50 45 4e 44 49    if( iPg==PENDI
214f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21500 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
21510 20 20 70 45 6e 74 72 79 20 3d 20 26 70 4d 61 70    pEntry = &pMap
21520 2d 3e 61 50 74 72 5b 69 50 67 20 2d 20 70 4d 61  ->aPtr[iPg - pMa
21530 70 2d 3e 69 46 69 72 73 74 5d 3b 0a 0a 20 20 20  p->iFirst];..   
21540 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 65 54 79   if( pEntry->eTy
21550 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
21560 41 47 45 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  AGE ){.      Pgn
21570 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72  o dummy;.      r
21580 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
21590 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
215a0 65 2c 20 26 64 75 6d 6d 79 2c 20 69 50 67 2c 20  e, &dummy, iPg, 
215b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
215c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
215d0 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
215e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
215f0 54 45 5f 4f 4b 20 7c 7c 20 64 75 6d 6d 79 3d 3d  TE_OK || dummy==
21600 69 50 67 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iPg );.    }else
21610 20 69 66 28 20 70 6e 43 75 72 72 65 6e 74 20 29   if( pnCurrent )
21620 7b 0a 20 20 20 20 20 20 62 74 72 65 65 47 65 74  {.      btreeGet
21630 50 61 67 65 28 70 42 74 2c 20 69 50 67 2c 20 26  Page(pBt, iPg, &
21640 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  pPg, 0);.      a
21650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
21660 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
21670 50 67 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  Pg->pDbPage) );.
21680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
21690 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
216a0 66 63 6f 75 6e 74 28 70 50 67 2d 3e 70 44 62 50  fcount(pPg->pDbP
216b0 61 67 65 29 3d 3d 31 20 29 3b 0a 20 20 20 20 20  age)==1 );.     
216c0 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75   iNew = ++(*pnCu
216d0 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  rrent);.      if
216e0 28 20 69 4e 65 77 3d 3d 50 45 4e 44 49 4e 47 5f  ( iNew==PENDING_
216f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
21700 20 69 4e 65 77 20 3d 20 2b 2b 28 2a 70 6e 43 75   iNew = ++(*pnCu
21710 72 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  rrent);.      rc
21720 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
21730 70 42 74 2c 20 70 50 67 2c 20 70 45 6e 74 72 79  pBt, pPg, pEntry
21740 2d 3e 65 54 79 70 65 2c 20 70 45 6e 74 72 79 2d  ->eType, pEntry-
21750 3e 70 61 72 65 6e 74 2c 20 69 4e 65 77 2c 20 31  >parent, iNew, 1
21760 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
21770 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  PageNotNull(pPg)
21780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21790 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
217a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
217b0 70 46 72 65 65 2c 20 26 69 4e 65 77 2c 20 69 46  pFree, &iNew, iF
217c0 69 72 73 74 2d 31 2c 20 42 54 41 4c 4c 4f 43 5f  irst-1, BTALLOC_
217d0 4c 45 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  LE);.      asser
217e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
217f0 20 7c 7c 20 69 4e 65 77 3c 69 46 69 72 73 74 20   || iNew<iFirst 
21800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21820 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
21830 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pg = 0;.        
21840 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
21850 65 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  e);.        btre
21860 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
21870 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
21880 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
21890 74 65 50 61 67 65 28 70 42 74 2c 20 70 50 67 2c  tePage(pBt, pPg,
218a0 20 70 45 6e 74 72 79 2d 3e 65 54 79 70 65 2c 20   pEntry->eType, 
218b0 70 45 6e 74 72 79 2d 3e 70 61 72 65 6e 74 2c 69  pEntry->parent,i
218c0 4e 65 77 2c 31 29 3b 0a 20 20 20 20 20 20 20 20  New,1);.        
218d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
218e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
218f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21900 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e 65 64 28  .}../* !defined(
21910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
21920 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a 20 54 68  URRENT).**.** Th
21930 65 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  e b-tree handle 
21940 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
21950 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
21960 62 6f 75 74 20 74 6f 20 63 6f 6d 6d 69 74 20 61  bout to commit a
21970 6e 0a 2a 2a 20 43 4f 4e 43 55 52 52 45 4e 54 20  n.** CONCURRENT 
21980 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20  transaction. At 
21990 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
219a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
219b0 20 74 68 69 73 20 69 73 20 0a 2a 2a 20 70 6f 73   this is .** pos
219c0 73 69 62 6c 65 20 2d 20 74 68 65 20 77 61 6c 20  sible - the wal 
219d0 57 52 49 54 45 52 20 6c 6f 63 6b 20 69 73 20 68  WRITER lock is h
219e0 65 6c 64 20 61 6e 64 20 69 74 20 69 73 20 6b 6e  eld and it is kn
219f0 6f 77 6e 20 74 68 61 74 20 74 68 65 72 65 20 61  own that there a
21a00 72 65 20 0a 2a 2a 20 6e 6f 20 63 6f 6e 66 6c 69  re .** no confli
21a10 63 74 73 20 77 69 74 68 20 63 6f 6d 6d 69 74 74  cts with committ
21a20 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
21a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
21a40 74 72 65 65 46 69 78 55 6e 6c 6f 63 6b 65 64 28  treeFixUnlocked(
21a50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
21a60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21a70 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
21a80 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
21a90 61 67 65 31 3b 0a 20 20 75 38 20 2a 70 31 20 3d  age1;.  u8 *p1 =
21aa0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
21ab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21ac0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
21ad0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21ae0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 61  _OK;..  /* If pa
21af0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
21b00 62 61 73 65 20 69 73 20 6e 6f 74 20 77 72 69 74  base is not writ
21b10 61 62 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 70 61  able, then no pa
21b20 67 65 73 20 77 65 72 65 20 61 6c 6c 6f 63 61 74  ges were allocat
21b30 65 64 0a 20 20 2a 2a 20 6f 72 20 66 72 65 65 64  ed.  ** or freed
21b40 20 62 79 20 74 68 69 73 20 74 72 61 6e 73 61 63   by this transac
21b50 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
21b60 73 65 20 6e 6f 20 73 70 65 63 69 61 6c 20 68 61  se no special ha
21b70 6e 64 6c 69 6e 67 20 69 73 20 0a 20 20 2a 2a 20  ndling is .  ** 
21b80 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
21b90 69 73 65 2c 20 69 66 20 70 61 67 65 20 31 20 69  ise, if page 1 i
21ba0 73 20 64 69 72 74 79 2c 20 70 72 6f 63 65 65 64  s dirty, proceed
21bb0 2e 20 20 2a 2f 0a 20 20 42 74 72 65 65 50 74 72  .  */.  BtreePtr
21bc0 6d 61 70 20 2a 70 4d 61 70 20 3d 20 70 42 74 2d  map *pMap = pBt-
21bd0 3e 70 4d 61 70 3b 0a 20 20 50 67 6e 6f 20 69 54  >pMap;.  Pgno iT
21be0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
21bf0 26 70 31 5b 33 32 5d 29 3b 0a 20 20 50 67 6e 6f  &p1[32]);.  Pgno
21c00 20 6e 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   nPage = btreePa
21c10 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
21c20 75 33 32 20 6e 46 72 65 65 20 3d 20 67 65 74 34  u32 nFree = get4
21c30 62 79 74 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a  byte(&p1[36]);..
21c40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
21c50 4d 61 70 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Map );.  rc = sq
21c60 6c 69 74 65 33 50 61 67 65 72 55 70 67 72 61 64  lite3PagerUpgrad
21c70 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72  eSnapshot(pPager
21c80 2c 20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  , pPage1->pDbPag
21c90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31  e);.  assert( p1
21ca0 3d 3d 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ==pPage1->aData 
21cb0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
21cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
21cd0 67 6e 6f 20 6e 48 50 61 67 65 20 3d 20 67 65 74  gno nHPage = get
21ce0 34 62 79 74 65 28 26 70 31 5b 32 38 5d 29 3b 0a  4byte(&p1[28]);.
21cf0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
21d00 6e 48 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  nHPage;         
21d10 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 61 66  /* Size of db af
21d20 74 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ter transaction 
21d30 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 20 20 69 66  merge */..    if
21d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
21d50 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
21d60 2d 3e 70 44 62 50 61 67 65 29 20 29 7b 0a 20 20  ->pDbPage) ){.  
21d70 20 20 20 20 50 67 6e 6f 20 69 48 54 72 75 6e 6b      Pgno iHTrunk
21d80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 31 5b   = get4byte(&p1[
21d90 33 32 5d 29 3b 0a 20 20 20 20 20 20 75 33 32 20  32]);.      u32 
21da0 6e 48 46 72 65 65 20 3d 20 67 65 74 34 62 79 74  nHFree = get4byt
21db0 65 28 26 70 31 5b 33 36 5d 29 3b 0a 0a 20 20 20  e(&p1[36]);..   
21dc0 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
21dd0 20 68 65 61 64 20 64 61 74 61 62 61 73 65 20 66   head database f
21de0 72 65 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  ree list to the 
21df0 65 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  end of the curre
21e00 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  nt.      ** tran
21e10 73 61 63 74 69 6f 6e 73 20 66 72 65 65 2d 6c 69  sactions free-li
21e20 73 74 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f  st (if any).  */
21e30 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
21e40 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k!=0 ){.        
21e50 70 75 74 34 62 79 74 65 28 26 70 31 5b 33 36 5d  put4byte(&p1[36]
21e60 2c 20 6e 48 46 72 65 65 20 2b 20 6e 46 72 65 65  , nHFree + nFree
21e70 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
21e80 79 74 65 28 26 70 31 5b 33 32 5d 2c 20 69 54 72  yte(&p1[32], iTr
21e90 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 77 68  unk);.        wh
21ea0 69 6c 65 28 20 69 54 72 75 6e 6b 20 29 7b 0a 20  ile( iTrunk ){. 
21eb0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
21ec0 2a 70 54 72 75 6e 6b 20 3d 20 73 71 6c 69 74 65  *pTrunk = sqlite
21ed0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
21ee0 67 65 72 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ger, iTrunk);.  
21ef0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
21f00 20 67 65 74 34 62 79 74 65 28 28 75 38 2a 29 70   get4byte((u8*)p
21f10 54 72 75 6e 6b 2d 3e 70 44 61 74 61 29 3b 0a 20  Trunk->pData);. 
21f20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54 72           if( iTr
21f30 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk==0 ){.      
21f40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 28        put4byte((
21f50 75 38 2a 29 70 54 72 75 6e 6b 2d 3e 70 44 61 74  u8*)pTrunk->pDat
21f60 61 2c 20 69 48 54 72 75 6e 6b 29 3b 0a 20 20 20  a, iHTrunk);.   
21f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21f80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
21f90 6e 72 65 66 28 70 54 72 75 6e 6b 29 3b 0a 20 20  nref(pTrunk);.  
21fa0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 7d        };.      }
21fb0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 48 50 61  ..      if( nHPa
21fc0 67 65 3c 28 70 4d 61 70 2d 3e 69 46 69 72 73 74  ge<(pMap->iFirst
21fd0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  -1) ){.        /
21fe0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
21ff0 6f 6e 73 69 73 74 65 64 20 6f 66 20 28 70 4d 61  onsisted of (pMa
22000 70 2d 3e 69 46 69 72 73 74 2d 31 29 20 70 61 67  p->iFirst-1) pag
22010 65 73 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  es when the curr
22020 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ent.        ** c
22030 6f 6e 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  oncurrent transa
22040 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
22050 2e 20 41 6e 64 20 61 6e 20 63 6f 6e 63 75 72 72  . And an concurr
22060 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
22070 6d 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  may.        ** n
22080 6f 74 20 62 65 20 65 78 65 63 75 74 65 64 20 6f  ot be executed o
22090 6e 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n an auto-vacuum
220a0 20 64 61 74 61 62 61 73 65 20 2d 20 73 6f 20 74   database - so t
220b0 68 65 20 64 62 20 73 68 6f 75 6c 64 20 0a 20 20  he db should .  
220c0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76        ** not hav
220d0 65 20 73 68 72 75 6e 6b 20 73 69 6e 63 65 20 74  e shrunk since t
220e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
220f0 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 72 65  as opened. There
22100 66 6f 72 65 20 6e 48 50 61 67 65 0a 20 20 20 20  fore nHPage.    
22110 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
22120 20 73 65 74 20 74 6f 20 28 70 4d 61 70 2d 3e 69   set to (pMap->i
22130 46 69 72 73 74 2d 31 29 20 6f 72 20 67 72 65 61  First-1) or grea
22140 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ter. */.        
22150 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
22160 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
22170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
22180 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72  * The current tr
22190 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 63 61  ansaction alloca
221a0 74 65 64 20 70 61 67 65 73 20 70 4d 61 70 2d 3e  ted pages pMap->
221b0 69 46 69 72 73 74 20 74 68 72 6f 75 67 68 0a 20  iFirst through. 
221c0 20 20 20 20 20 20 20 2a 2a 20 6e 50 61 67 65 20         ** nPage 
221d0 28 69 6e 63 6c 75 73 69 76 65 29 20 61 74 20 74  (inclusive) at t
221e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
221f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4d 65 61  tabase file. Mea
22200 6e 77 68 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  nwhile,.        
22210 2a 2a 20 6f 74 68 65 72 20 74 72 61 6e 73 61 63  ** other transac
22220 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 6c 6f 63  tions have alloc
22230 61 74 65 64 20 28 69 46 69 72 73 74 2e 2e 6e 48  ated (iFirst..nH
22240 50 61 67 65 29 2e 20 53 6f 20 6d 6f 76 65 0a 20  Page). So move. 
22250 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
22260 28 69 46 69 72 73 74 2e 2e 4d 49 4e 28 6e 50 61  (iFirst..MIN(nPa
22270 67 65 2c 6e 48 50 61 67 65 29 29 20 74 6f 20 28  ge,nHPage)) to (
22280 4d 41 58 28 6e 50 61 67 65 2c 6e 48 50 61 67 65  MAX(nPage,nHPage
22290 29 2b 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20  )+1).  */.      
222a0 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 4d    Pgno iLast = M
222b0 49 4e 28 6e 50 61 67 65 2c 20 6e 48 50 61 67 65  IN(nPage, nHPage
222c0 29 3b 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61  );    /* Last pa
222d0 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
222e0 20 20 20 20 20 20 50 67 6e 6f 20 6e 43 75 72 72        Pgno nCurr
222f0 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
22300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
22310 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 64 62 20  rent size of db 
22320 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 75 72 72  */.        nCurr
22330 65 6e 74 20 3d 20 4d 41 58 28 6e 50 61 67 65 2c  ent = MAX(nPage,
22340 20 6e 48 50 61 67 65 29 3b 0a 20 20 20 20 20 20   nHPage);.      
22350 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 6c 6f    rc = btreeRelo
22360 63 61 74 65 52 61 6e 67 65 28 70 42 74 2c 20 70  cateRange(pBt, p
22370 4d 61 70 2d 3e 69 46 69 72 73 74 2c 20 69 4c 61  Map->iFirst, iLa
22380 73 74 2c 20 26 6e 43 75 72 72 65 6e 74 29 3b 0a  st, &nCurrent);.
22390 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72  .        /* Ther
223a0 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 63 6f 6c  e are now no col
223b0 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 74 68 65  lisions with the
223c0 20 73 6e 61 70 73 68 6f 74 20 61 74 20 74 68 65   snapshot at the
223d0 20 68 65 61 64 20 6f 66 20 74 68 65 0a 20 20 20   head of the.   
223e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
223f0 20 66 69 6c 65 2e 20 53 6f 20 61 74 20 74 68 69   file. So at thi
22400 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
22410 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
22420 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
22430 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22440 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 42 65   out to disk. Be
22450 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 20 74 68  fore doing so th
22460 6f 75 67 68 2c 20 61 74 74 65 6d 70 74 20 74 6f  ough, attempt to
22470 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6c 6f  .        ** relo
22480 63 61 74 65 20 73 6f 6d 65 20 6f 66 20 74 68 65  cate some of the
22490 20 6e 65 77 20 70 61 67 65 73 20 74 6f 20 66 72   new pages to fr
224a0 65 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74  ee locations wit
224b0 68 69 6e 20 74 68 65 20 62 6f 64 79 0a 20 20 20  hin the body.   
224c0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64       ** of the d
224d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 69 2e  atabase file (i.
224e0 65 2e 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74  e. free-list ent
224f0 72 69 65 73 29 2e 20 2a 2f 0a 20 20 20 20 20 20  ries). */.      
22500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22520 20 61 73 73 65 72 74 28 20 6e 43 75 72 72 65 6e   assert( nCurren
22530 74 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t!=PENDING_BYTE_
22540 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
22550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
22560 67 65 72 53 65 74 44 62 73 69 7a 65 28 70 42 74  gerSetDbsize(pBt
22570 2d 3e 70 50 61 67 65 72 2c 20 6e 43 75 72 72 65  ->pPager, nCurre
22580 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  nt);.          n
22590 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
225a0 26 70 31 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  &p1[36]);.      
225b0 20 20 20 20 6e 46 69 6e 20 3d 20 6e 43 75 72 72      nFin = nCurr
225c0 65 6e 74 2d 6e 46 72 65 65 3b 0a 20 20 20 20 20  ent-nFree;.     
225d0 20 20 20 20 20 69 66 28 20 6e 43 75 72 72 65 6e       if( nCurren
225e0 74 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  t>PENDING_BYTE_P
225f0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
22600 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
22610 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
22620 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
22630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22640 20 20 20 20 20 20 6e 46 69 6e 20 3d 20 4d 41 58        nFin = MAX
22650 28 6e 46 69 6e 2c 20 6e 48 50 61 67 65 29 3b 0a  (nFin, nHPage);.
22660 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
22670 74 72 65 65 52 65 6c 6f 63 61 74 65 52 61 6e 67  treeRelocateRang
22680 65 28 70 42 74 2c 20 6e 46 69 6e 2b 31 2c 20 6e  e(pBt, nFin+1, n
22690 43 75 72 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  Current, 0);.   
226a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
226b0 70 75 74 34 62 79 74 65 28 26 70 31 5b 32 38 5d  put4byte(&p1[28]
226c0 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 7d  , nFin);.      }
226d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
226e0 65 33 50 61 67 65 72 53 65 74 44 62 73 69 7a 65  e3PagerSetDbsize
226f0 28 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  (pPager, nFin);.
22700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
22710 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
22720 6e 65 20 62 74 72 65 65 46 69 78 55 6e 6c 6f 63  ne btreeFixUnloc
22730 6b 65 64 28 58 29 20 20 53 51 4c 49 54 45 5f 4f  ked(X)  SQLITE_O
22740 4b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  K.#endif /* SQLI
22750 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
22760 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  NT */../*.** Thi
22770 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
22780 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
22790 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
227a0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
227b0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
227c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
227d0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
227e0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
227f0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
22800 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
22810 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
22820 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
22830 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
22840 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
22850 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
22860 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
22870 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
22880 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
22890 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
228a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
228b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
228c0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
228d0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
228e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
228f0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
22900 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
22910 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
22920 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
22930 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
22940 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
22950 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
22960 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
22970 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
22980 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
22990 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
229a0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
229b0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
229c0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
229d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
229e0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
229f0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
22a00 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
22a10 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
22a20 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
22a30 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
22a40 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
22a50 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
22a60 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
22a70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
22a80 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
22a90 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
22aa0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
22ab0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
22ac0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
22ad0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
22ae0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
22af0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
22b00 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
22b10 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
22b20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
22b30 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
22b40 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
22b50 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
22b60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
22b70 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
22b80 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
22b90 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
22ba0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
22bb0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
22bc0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
22bd0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
22be0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
22bf0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
22c00 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
22c10 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
22c20 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
22c30 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
22c40 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
22c50 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
22c60 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
22c70 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
22c80 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
22c90 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
22ca0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
22cb0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
22cc0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
22cd0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
22ce0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
22cf0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
22d00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22d10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
22d20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
22d30 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
22d40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
22d50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
22d60 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  (p);..#ifndef SQ
22d70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22d80 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
22d90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
22da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 53        assert( IS
22db0 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 29 3b  CONCURRENT==0 );
22dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
22dd0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
22de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
22df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
22e10 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
22e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22e40 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
22e50 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
22e60 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
22e70 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
22e80 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
22e90 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
22ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22eb0 54 45 5f 4f 4b 20 26 26 20 49 53 43 4f 4e 43 55  TE_OK && ISCONCU
22ec0 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72  RRENT ){.      r
22ed0 63 20 3d 20 62 74 72 65 65 46 69 78 55 6e 6c 6f  c = btreeFixUnlo
22ee0 63 6b 65 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20  cked(p);.    }. 
22ef0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
22f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
22f20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
22f30 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
22f40 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
22f50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22f60 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
22f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22f80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22f90 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
22fa0 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
22fb0 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
22fc0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
22fd0 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
22fe0 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
22ff0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
23000 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
23010 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
23020 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
23030 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
23040 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
23050 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
23060 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23070 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
23080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23090 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
230a0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
230b0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
230c0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
230d0 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
230e0 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
230f0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
23100 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
23110 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
23120 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
23130 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
23140 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
23150 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
23160 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
23170 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
23180 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
23190 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
231a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
231b0 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
231c0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
231d0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
231e0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
231f0 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
23200 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
23210 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
23220 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
23230 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
23240 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
23250 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
23260 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
23270 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
23280 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
23290 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
232a0 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
232b0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
232c0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
232d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
232e0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
232f0 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
23300 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
23310 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
23320 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
23330 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
23340 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
23350 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
23360 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
23370 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
23380 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
23390 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
233a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
233b0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
233c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
233d0 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
233e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
233f0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
23400 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
23410 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
23420 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
23430 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
23440 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
23450 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
23460 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
23470 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
23480 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
23490 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pBt);.  }..  /*
234a0 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
234b0 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73  CONCURRENT trans
234c0 61 63 74 69 6f 6e 2c 20 64 65 6c 65 74 65 20 74  action, delete t
234d0 68 65 20 70 42 74 2d 3e 70 4d 61 70 20 6f 62 6a  he pBt->pMap obj
234e0 65 63 74 2e 0a 20 20 2a 2a 20 41 6c 73 6f 20 63  ect..  ** Also c
234f0 61 6c 6c 20 50 61 67 65 72 45 6e 64 43 6f 6e 63  all PagerEndConc
23500 75 72 72 65 6e 74 28 29 20 74 6f 20 65 6e 73 75  urrent() to ensu
23510 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
23520 72 20 68 61 73 20 64 69 73 63 61 72 64 65 64 0a  r has discarded.
23530 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 20    ** the record 
23540 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  of all pages rea
23550 64 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  d within the tra
23560 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
23570 62 74 72 65 65 50 74 72 6d 61 70 44 65 6c 65 74  btreePtrmapDelet
23580 65 28 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  e(pBt);.  sqlite
23590 33 50 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72  3PagerEndConcurr
235a0 65 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ent(pBt->pPager)
235b0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
235c0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
235d0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
235e0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
235f0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
23600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23610 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
23620 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
23630 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
23640 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
23650 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
23660 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
23670 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
23680 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
23690 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
236a0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
236b0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
236c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
236d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
236e0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
236f0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
23700 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
23710 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
23720 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
23730 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
23740 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
23750 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
23760 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
23770 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
23780 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
23790 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
237a0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
237b0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
237c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
237d0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
237e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
237f0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
23800 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
23810 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
23820 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
23830 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
23840 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
23850 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
23860 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
23870 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
23880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23890 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
238a0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
238b0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
238c0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
238d0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
238e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
238f0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
23900 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
23910 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
23920 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
23930 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
23940 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
23950 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
23960 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
23970 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
23980 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
23990 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
239a0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
239b0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
239c0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
239d0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
239e0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
239f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
23a00 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
23a10 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
23a20 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
23a30 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
23a40 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
23a50 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
23a60 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
23a70 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
23a80 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
23a90 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
23aa0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
23ab0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
23ac0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
23ad0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
23ae0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
23af0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23b00 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
23b10 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
23b20 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
23b30 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
23b40 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
23b50 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
23b60 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
23b70 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
23b80 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
23b90 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
23ba0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
23bb0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
23bc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
23bd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
23be0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
23bf0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
23c00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
23c10 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
23c20 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
23c30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
23c40 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
23c50 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
23c60 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
23c70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
23c80 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
23c90 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
23ca0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23cb0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
23cc0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
23cd0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
23ce0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23cf0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
23d00 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
23d10 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
23d20 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
23d30 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
23d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
23d50 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
23d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
23d70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
23d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23d90 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
23da0 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
23db0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
23dc0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
23dd0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
23de0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
23df0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
23e00 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
23e10 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
23e20 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
23e30 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
23e40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
23e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23e70 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
23e80 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
23e90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23ea0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
23eb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
23ec0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23ed0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23ee0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
23ef0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
23f00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23f10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23f20 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
23f30 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
23f40 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
23f50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
23f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
23f80 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
23f90 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
23fa0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
23fb0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
23fc0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
23fd0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
23fe0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
23ff0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
24000 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
24010 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
24020 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
24030 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
24040 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
24050 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
24060 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
24070 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
24080 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
24090 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
240a0 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
240b0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
240c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
240d0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
240e0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
240f0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
24100 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
24110 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
24120 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
24130 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
24140 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
24150 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
24160 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
24170 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
24180 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
24190 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
241a0 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
241b0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
241c0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
241d0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
241e0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
241f0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
24200 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
24210 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
24220 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
24230 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
24240 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
24250 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
24260 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
24270 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
24280 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
24290 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
242a0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
242b0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
242c0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
242d0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
242e0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
242f0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
24300 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
24310 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
24320 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
24330 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
24340 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
24350 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
24360 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
24370 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
24380 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
24390 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
243a0 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
243b0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
243c0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
243d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
243e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
243f0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
24400 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
24410 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
24420 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
24430 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
24440 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
24450 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
24460 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
24470 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
24480 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
24490 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
244a0 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
244b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
244c0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
244d0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
244e0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
244f0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
24500 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
24510 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
24520 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
24530 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
24540 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
24550 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
24560 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
24570 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
24580 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
24590 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
245a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
245b0 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
245c0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65  OR_VALID || p->e
245d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
245e0 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
245f0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
24600 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
24610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
24620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24630 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
24640 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69  )sqlite3BtreeTri
24650 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72  pAllCursors(pBtr
24660 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  ee, rc, 0);.    
24670 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24690 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
246a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
246b0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
246c0 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  r(p);.        p-
246d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
246e0 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20  _FAULT;.        
246f0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
24700 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  rCode;.      }. 
24710 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24720 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
24730 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
24740 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
24750 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ]);.        p->a
24760 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
24770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24790 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
247a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
247b0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
247c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
247d0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
247e0 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20   If tripCode is 
247f0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68  not SQLITE_OK th
24800 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  en cursors will 
24810 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28  be invalidated (
24820 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c  tripped)..** Onl
24830 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
24840 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77  are tripped if w
24850 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65  riteOnly is true
24860 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73   but all cursors
24870 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20   are.** tripped 
24880 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
24890 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65  false.  Any atte
248a0 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20  mpt to use.** a 
248b0 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77  tripped cursor w
248c0 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
248d0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
248e0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
248f0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
24900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24910 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
24920 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
24930 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
24940 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
24950 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
24960 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
24970 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
24980 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74  nt tripCode, int
24990 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69   writeOnly){.  i
249a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
249b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
249c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
249d0 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77  e1;..  assert( w
249e0 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77  riteOnly==1 || w
249f0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  riteOnly==0 );. 
24a00 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64   assert( tripCod
24a10 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  e==SQLITE_ABORT_
24a20 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70  ROLLBACK || trip
24a30 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
24a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
24a50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
24a60 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
24a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
24a80 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
24a90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
24aa0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
24ab0 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20  c ) writeOnly = 
24ac0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
24ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ae0 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
24af0 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
24b00 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
24b10 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
24b20 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74  , tripCode, writ
24b30 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65  eOnly);.    asse
24b40 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
24b50 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d  K || (writeOnly=
24b60 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54  =0 && rc2==SQLIT
24b70 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28  E_OK) );.    if(
24b80 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
24b90 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a  ) rc = rc2;.  }.
24ba0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
24bb0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
24bc0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
24bd0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
24be0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
24bf0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
24c00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
24c10 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
24c20 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
24c30 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
24c40 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
24c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24c60 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
24c70 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
24c80 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
24c90 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
24ca0 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
24cb0 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
24cc0 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
24cd0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
24ce0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
24cf0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
24d00 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
24d10 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
24d20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
24d30 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
24d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24d50 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
24d60 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
24d70 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
24d80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
24d90 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
24da0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
24db0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
24dc0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
24dd0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
24de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
24df0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
24e00 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
24e10 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
24e20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
24e30 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
24e40 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
24e50 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
24e60 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
24e70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
24e80 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
24e90 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
24ea0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
24eb0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
24ec0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
24ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24ee0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
24ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
24f00 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
24f10 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
24f20 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
24f30 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
24f40 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
24f50 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
24f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
24f70 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
24f80 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
24f90 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
24fa0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
24fb0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
24fc0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
24fd0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
24fe0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
24ff0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
25000 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
25010 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
25020 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
25030 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
25040 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
25050 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
25060 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
25070 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
25080 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
25090 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
250a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
250b0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
250c0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
250d0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
250e0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
250f0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
25100 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
25110 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
25120 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
25130 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
25140 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
25150 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
25160 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
25170 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
25180 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
25190 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
251a0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
251b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
251c0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
251d0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
251e0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
251f0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
25200 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
25210 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
25220 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
25230 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
25240 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
25250 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
25260 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
25270 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
25280 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
25290 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
252a0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
252b0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
252c0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
252d0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
252e0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
252f0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
25300 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
25310 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
25320 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
25330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
25340 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
25350 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
25360 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
25370 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
25380 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
25390 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
253a0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
253b0 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
253c0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
253d0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
253e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
253f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
25400 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
25410 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
25420 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
25430 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
25440 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
25450 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
25460 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
25470 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
25480 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
25490 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
254a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
254b0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
254c0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
254d0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
254e0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
254f0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
25500 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
25510 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
25520 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
25530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
25540 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
25550 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
25560 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ent);.  if( rc==
25570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25580 20 72 63 20 3d 20 62 74 72 65 65 50 74 72 6d 61   rc = btreePtrma
25590 70 42 65 67 69 6e 28 70 42 74 2c 20 69 53 74 61  pBegin(pBt, iSta
255a0 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  tement);.  }.  s
255b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
255c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
255d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
255e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
255f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
25600 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
25610 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
25620 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
25630 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
25640 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
25650 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
25660 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
25670 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
25680 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
25690 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
256a0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
256b0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
256c0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
256d0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
256e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
256f0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
25700 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
25710 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
25720 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
25730 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
25740 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
25750 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
25760 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
25770 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
25780 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
25790 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
257a0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
257b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
257c0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
257d0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
257e0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
257f0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
25800 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
25810 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
25820 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
25830 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
25840 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
25850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25860 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
25870 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
25880 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
25890 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
258a0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
258b0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
258c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
258d0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
258e0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
258f0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
25900 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
25910 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
25920 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
25930 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
25940 20 20 20 20 62 74 72 65 65 50 74 72 6d 61 70 45      btreePtrmapE
25950 6e 64 28 70 42 74 2c 20 6f 70 2c 20 69 53 61 76  nd(pBt, op, iSav
25960 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
25970 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
25980 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
25990 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
259a0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
259b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
259c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
259d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
259e0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
259f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
25a00 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
25a10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
25a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25a30 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
25a40 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
25a50 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
25a60 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
25a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
25a80 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
25a90 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
25aa0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
25ab0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
25ac0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
25ad0 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
25ae0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
25af0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
25b00 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
25b10 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
25b20 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
25b30 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
25b40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
25b50 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
25b60 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
25b70 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
25b80 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
25b90 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
25ba0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
25bb0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
25bc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25bd0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
25be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
25bf0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
25c00 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
25c10 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
25c20 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
25c30 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
25c40 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
25c50 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
25c60 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
25c70 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
25c80 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
25c90 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
25ca0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
25cb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
25cc0 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
25cd0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
25ce0 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
25cf0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
25d00 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
25d10 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
25d20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
25d30 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53  f the BTREE_WRCS
25d40 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  R bit of wrFlag 
25d50 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74  is clear, then t
25d60 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
25d70 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f  ly.** be used fo
25d80 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74  r reading.  If t
25d90 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
25da0 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  it is set, then 
25db0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
25dc0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
25dd0 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69  ading or for wri
25de0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
25df0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
25e00 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  ting.** are also
25e10 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65   met.  These are
25e20 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
25e30 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
25e40 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72   in order.** for
25e50 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61   writing to be a
25e60 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
25e70 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
25e80 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
25e90 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63  ed with wrFlag c
25ea0 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f  ontaining BTREE_
25eb0 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  WRCSR.**.** 2:  
25ec0 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
25ed0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
25ee0 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
25ef0 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
25f00 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
25f10 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
25f20 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
25f30 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
25f40 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
25f50 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
25f60 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
25f70 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
25f80 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
25f90 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
25fa0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
25fb0 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
25fc0 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
25fd0 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
25fe0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
25ff0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
26000 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
26010 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
26020 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
26030 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
26040 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
26050 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
26060 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
26070 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45   The BTREE_FORDE
26080 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c  LETE bit of wrFl
26090 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c  ag may optionall
260a0 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45  y be set if BTRE
260b0 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65  E_WRCSR.** is se
260c0 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45  t.  If FORDELETE
260d0 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73   is set, that is
260e0 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
260f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
26100 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f  at.** this curso
26110 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75  r will only be u
26120 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61  sed to seek to a
26130 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65  nd delete entrie
26140 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  s of an index.**
26150 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61   as part of a la
26160 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74  rger DELETE stat
26170 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44  ement.  The FORD
26180 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f  ELETE hint is no
26190 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  t used by.** thi
261a0 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
261b0 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f  .  But in a hypo
261c0 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61  thetical alterna
261d0 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67  tive storage eng
261e0 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68  ine .** in which
261f0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61   index entries a
26200 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
26210 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f   deleted when co
26220 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
26230 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65  e.** rows are de
26240 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45  leted, the FORDE
26250 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68  LETE flag is a h
26260 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45  int that all SEE
26270 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20  K and DELETE.** 
26280 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68  operations on th
26290 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  is cursor can be
262a0 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20   no-ops and all 
262b0 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20  READ operations 
262c0 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  can .** return a
262d0 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74   null row (2-byt
262e0 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a  es: 0x01 0x00)..
262f0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
26300 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
26310 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
26320 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
26330 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
26340 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
26350 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
26360 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
26370 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
26380 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
26390 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
263a0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
263b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
263c0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
263d0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
263e0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
263f0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
26400 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
26410 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
26420 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
26430 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
26440 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
26470 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
26480 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
264b0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
264c0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
264f0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
26500 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
26510 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
26520 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
26530 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
26540 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
26550 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
26560 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
26590 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
265a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
265b0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
265c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
265d0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
265e0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
265f0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26610 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68  Looping over oth
26620 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a  er all cursors *
26630 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
26640 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
26650 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
26660 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20  rt( wrFlag==0 . 
26670 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
26680 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20  =BTREE_WRCSR .  
26690 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
266a0 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52  (BTREE_WRCSR|BTR
266b0 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20  EE_FORDELETE) . 
266c0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
266d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
266e0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
266f0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
26700 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
26710 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
26720 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
26730 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
26740 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
26750 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
26760 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
26770 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
26780 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
26790 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
267a0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
267b0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
267c0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
267d0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
267e0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
267f0 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29   (wrFlag?2:1)) )
26800 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
26810 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
26820 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
26830 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
26840 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
26850 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
26860 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
26870 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
26880 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
26890 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
268a0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
268b0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
268c0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
268d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
268e0 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
268f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
26900 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
26910 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62  ag==0 || (pBt->b
26920 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
26930 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a  AD_ONLY)==0 );..
26940 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
26950 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
26960 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
26970 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
26980 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
26990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
269a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
269b0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
269c0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
269d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
269e0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
269f0 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
26a00 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
26a10 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
26a20 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
26a30 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
26a40 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
26a50 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
26a60 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
26a70 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
26a80 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
26a90 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
26aa0 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
26ab0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
26ac0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
26ad0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
26ae0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
26af0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
26b00 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
26b10 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
26b20 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
26b30 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  .  pCur->curPage
26b40 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
26b50 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f  ? 0 : PAGER_GET_
26b60 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49  READONLY;.  /* I
26b70 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
26b80 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
26b90 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
26ba0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
26bb0 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d  .  ** cursors *m
26bc0 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54  ust* have the BT
26bd0 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
26be0 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70   set. */.  for(p
26bf0 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  X=pBt->pCursor; 
26c00 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
26c10 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  ){.    if( pX->p
26c20 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69  gnoRoot==(Pgno)i
26c30 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
26c40 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  X->curFlags |= B
26c50 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
26c60 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26c70 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
26c80 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ple;.    }.  }. 
26c90 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
26ca0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70  Bt->pCursor;.  p
26cb0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
26cc0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
26cd0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
26ce0 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
26cf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
26d00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
26d10 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
26d50 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d80 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
26d90 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
26da0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26dd0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
26de0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
26df0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
26e00 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
26e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
26e20 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
26e30 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
26e40 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
26e70 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
26e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
26e90 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b   if( iTable<1 ){
26ea0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
26eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
26ed0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
26ee0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
26ef0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
26f00 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
26f10 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73  fo, pCur);.    s
26f20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
26f30 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
26f40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
26f50 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
26f60 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
26f70 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
26f80 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
26f90 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
26fa0 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
26fb0 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
26fc0 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
26fd0 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
26fe0 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
26ff0 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
27000 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
27010 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
27020 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
27030 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
27040 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
27050 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
27060 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
27070 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
27080 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
27090 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
270a0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
270b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
270c0 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
270d0 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
270e0 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
270f0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
27100 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
27110 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
27120 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
27130 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
27140 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
27150 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
27160 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
27170 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
27180 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
27190 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
271a0 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
271b0 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
271c0 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
271d0 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
271e0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
271f0 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
27200 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
27210 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
27220 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
27230 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
27240 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
27250 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
27260 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
27270 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
27280 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
27290 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
272a0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
272b0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
272c0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
272d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
272e0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
272f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
27300 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
27310 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
27320 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
27330 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
27340 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
27350 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
27360 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
27370 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
27380 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
27390 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pCur);.    asser
273a0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21  t( pBt->pCursor!
273b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  =0 );.    if( pB
273c0 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72  t->pCursor==pCur
273d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
273e0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
273f0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
27400 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20  .      BtCursor 
27410 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43  *pPrev = pBt->pC
27420 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b  ursor;.      do{
27430 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
27440 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20  ev->pNext==pCur 
27450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  ){.          pPr
27460 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
27470 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
27480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27490 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65    }.        pPre
274a0 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  v = pPrev->pNext
274b0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
274c0 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b  ALWAYS(pPrev) );
274d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
274e0 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
274f0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
27500 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
27510 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
27520 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
27530 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
27540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27550 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
27560 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
27570 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
27580 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
27590 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
275a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
275b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
275c0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
275d0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
275e0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
275f0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
27600 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
27610 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
27620 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
27630 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
27640 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
27650 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
27660 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
27670 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
27680 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
27690 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
276a0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
276b0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
276c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
276d0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
276e0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66  seCell()..*/.#if
276f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
27700 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
27710 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
27720 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
27730 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
27740 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
27750 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
27760 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
27770 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
27780 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
27790 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
277a0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c 20  age], pCur->ix, 
277b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
277c0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
277d0 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
277e0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
277f0 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
27800 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
27810 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
27820 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74  nfo(x).#endif.st
27830 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
27840 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c  LINE void getCel
27850 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
27860 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
27870 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
27880 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67   ){.    int iPag
27890 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
278a0 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
278b0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
278c0 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
278d0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
278e0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
278f0 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e  ur->ix,&pCur->in
27900 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
27910 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
27920 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
27930 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
27940 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
27950 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
27960 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
27970 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
27980 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
27990 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
279a0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
279b0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
279c0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
279d0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
279e0 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
279f0 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
27a00 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
27a10 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
27a20 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
27a30 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
27a40 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
27a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27a60 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
27a70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27a80 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
27a90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27aa0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
27ab0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
27ac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27ad0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
27ae0 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  NN(BtCursor *pCu
27af0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  r){.  assert( pC
27b00 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  ur!=0 );.  retur
27b10 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  n pCur->eState==
27b20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
27b30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27b40 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
27b50 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72  nteger key or "r
27b60 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c  owid" for a tabl
27b70 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73  e btree..** This
27b80 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
27b90 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72   valid for a cur
27ba0 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
27bb0 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f  ting into a.** o
27bc0 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74  rdinary table bt
27bd0 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ree.  If the cur
27be0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  sor points to an
27bf0 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a   index btree or.
27c00 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74  ** is invalid, t
27c10 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69  he result of thi
27c20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64  s routine is und
27c30 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73  efined..*/.i64 s
27c40 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
27c50 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  erKey(BtCursor *
27c60 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
27c70 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27c80 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27c90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27ca0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27cc0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
27cd0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
27ce0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
27cf0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d  ur->info.nKey;.}
27d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
27d10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
27d20 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f  es of payload fo
27d30 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
27d40 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72   pCur is.** curr
27d50 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
27d60 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74  o.  For table bt
27d70 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
27d80 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  be the amount.**
27d90 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69   of data.  For i
27da0 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69  ndex btrees, thi
27db0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69  s will be the si
27dc0 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a  ze of the key..*
27dd0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
27de0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
27df0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
27e00 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
27e10 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
27e20 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
27e30 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
27e40 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
27e50 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
27e60 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
27e70 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
27e80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27e90 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  D..*/.u32 sqlite
27ea0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
27eb0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
27ec0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
27ed0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27ee0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
27ef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27f00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27f10 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
27f20 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
27f30 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
27f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
27f50 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
27f60 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
27f70 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
27f80 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
27f90 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
27fa0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
27fb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
27fc0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
27fd0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
27fe0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
27ff0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
28000 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
28010 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
28020 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
28030 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
28040 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
28050 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
28060 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
28070 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28080 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
28090 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
280a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
280b0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
280c0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
280d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
280e0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
280f0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
28100 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
28110 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
28120 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
28130 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
28140 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
28150 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
28160 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
28170 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
28180 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
28190 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
281a0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
281b0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
281c0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
281d0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
281e0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
281f0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
28200 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
28210 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
28220 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
28230 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
28240 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
28250 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
28260 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
28270 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
28280 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
28290 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
282a0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
282b0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
282c0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
282d0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
282e0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
282f0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
28300 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
28310 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
28320 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
28330 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
28340 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
28350 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
28360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
28370 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
28380 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
28390 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
283a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
283b0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
283c0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
283d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
283e0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
283f0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
28400 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
28410 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
28420 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
28430 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
28440 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28450 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
28460 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28470 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
28480 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
28490 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
284a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
284b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
284c0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
284d0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
284e0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
284f0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
28500 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
28510 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
28520 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
28530 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
28540 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
28550 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
28560 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
28570 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
28580 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
28590 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
285a0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
285b0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
285c0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
285d0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
285e0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
285f0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
28600 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
28610 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
28620 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
28630 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
28640 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
28650 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
28660 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
28670 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
28680 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
28690 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
286a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
286b0 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
286c0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
286d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
286e0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
286f0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
28700 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28710 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
28720 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
28730 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
28740 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
28750 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
28760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
28770 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
28780 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
28790 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
287a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
287b0 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
287c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
287d0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
287e0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
287f0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
28800 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
28810 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
28820 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28830 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
28840 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
28850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28860 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
28870 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
28880 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
28890 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
288a0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
288b0 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
288c0 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
288d0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
288e0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
288f0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
28900 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
28910 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
28920 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
28930 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
28940 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
28950 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
28960 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
28970 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
28980 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
28990 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
289a0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
289b0 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
289c0 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
289d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
289e0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
289f0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
28a00 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
28a10 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
28a20 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
28a30 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
28a40 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
28a50 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
28a60 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
28a70 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
28a80 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
28a90 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
28aa0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
28ab0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
28ac0 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
28ad0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
28ae0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
28af0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
28b00 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
28b10 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
28b20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
28b30 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
28b40 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
28b50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
28b60 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
28b70 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
28b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28b90 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
28ba0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
28bd0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
28be0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
28bf0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
28c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28c10 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
28c20 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
28c30 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
28c40 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
28c50 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
28c60 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
28c70 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
28c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28c90 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
28ca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
28cc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28cd0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
28ce0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
28cf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
28d00 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
28d10 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
28d20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
28d30 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
28d40 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
28d50 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
28d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28d80 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
28d90 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
28da0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
28db0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
28dc0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
28dd0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
28de0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
28df0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
28e00 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
28e10 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
28e20 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
28e30 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
28e40 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
28e50 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
28e60 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
28e70 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
28e80 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
28e90 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
28ea0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
28eb0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
28ec0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
28ed0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
28ee0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
28ef0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
28f00 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
28f10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
28f20 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
28f30 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
28f40 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
28f50 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
28f60 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
28f70 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
28f80 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
28f90 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
28fa0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
28fb0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
28fc0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20  erflow pages.** 
28fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
28fe0 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
28ff0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
29000 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20  populate.** the 
29010 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
29020 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
29030 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
29040 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
29050 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
29060 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
29070 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
29080 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
29090 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
290a0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
290b0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
290c0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
290d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
290e0 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  t must be.** inv
290f0 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
29100 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
29110 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
29120 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
29130 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
29140 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
29150 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
29160 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
29170 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
29180 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
29190 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
291a0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
291b0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
291c0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
291d0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
291e0 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
291f0 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
29200 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
29210 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
29220 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
29230 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
29240 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
29250 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
29260 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
29270 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
29280 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
29290 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
292a0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
292b0 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
292c0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
292d0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
292e0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
292f0 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
29300 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
29310 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
29320 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
29330 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
29340 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
29350 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
29360 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
29370 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
29380 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
29390 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
293a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
293b0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
293c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
293d0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
293e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
293f0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29400 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
29410 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
29420 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
29430 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
29440 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29460 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
29470 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
29480 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29490 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
294a0 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  EAD.  unsigned c
294b0 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66  har * const pBuf
294c0 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20  Start = pBuf;   
294d0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72    /* Start of or
294e0 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65  iginal out buffe
294f0 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  r */.#endif..  a
29500 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
29510 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30    assert( eOp==0
29520 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20   || eOp==1 );.  
29530 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29540 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29550 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
29560 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
29570 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
29580 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29590 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
295a0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
295b0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
295c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
295d0 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  oad;.  assert( o
295e0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
295f0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
29600 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61   );..  assert( a
29610 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d  Payload > pPage-
29620 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20  >aData );.  if( 
29630 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20  (uptr)(aPayload 
29640 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20  - pPage->aData) 
29650 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  > (pBt->usableSi
29660 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze - pCur->info.
29670 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  nLocal) ){.    /
29680 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
29690 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
296a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
296b0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  ta is an error. 
296c0 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64   The.    ** cond
296d0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73  itional above is
296e0 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20   really:.    ** 
296f0 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75     &aPayload[pCu
29700 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
29710 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
29720 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
29730 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72  .    ** but is r
29740 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63  ecast into its c
29750 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61  urrent form to a
29760 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65  void integer ove
29770 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20  rflow problems. 
29780 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
29790 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
297a0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
297b0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
297c0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
297d0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
297e0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
297f0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
29800 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
29810 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
29820 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
29830 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
29840 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
29850 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
29860 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
29870 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
29880 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
29890 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
298a0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
298b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
298c0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
298d0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
298e0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
298f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
29900 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
29910 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
29920 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29930 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
29940 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
29950 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
29960 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
29970 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
29980 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
29990 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
299a0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
299b0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
299c0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
299d0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
299e0 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
299f0 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
29a00 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
29a10 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
29a20 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20  t now..    **.  
29a30 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
29a40 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
29a50 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
29a60 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
29a70 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
29a80 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
29a90 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
29aa0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
29ab0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
29ac0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
29ad0 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
29ae0 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
29af0 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
29b00 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
29b10 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
29b20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
29b30 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
29b40 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
29b50 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
29b60 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29b70 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
29b80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
29b90 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
29ba0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
29bb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
29bc0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
29bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
29be0 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
29bf0 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
29c00 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
29c10 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
29c20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
29c30 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
29c40 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
29c50 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
29c60 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
29c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29c80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29c90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
29ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29cb0 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
29cc0 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
29cd0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
29ce0 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
29cf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29d00 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
29d10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
29d20 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66   0, nOvfl*sizeof
29d30 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70  (Pgno));.      p
29d40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
29d50 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
29d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29d70 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
29d80 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
29d90 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
29da0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
29db0 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66        ** entry f
29dc0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
29dd0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
29de0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
29df0 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  ip.      ** dire
29e00 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
29e10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
29e20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
29e30 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
29e40 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20  ){.        iIdx 
29e50 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
29e60 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  ze);.        nex
29e70 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
29e80 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
29e90 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
29ea0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
29eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29ec0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
29ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
29ee0 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c  mt>0 );.    whil
29ef0 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20  e( nextPage ){. 
29f00 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
29f10 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
29f20 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
29f30 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
29f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
29f50 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
29f60 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  x]==0.          
29f70 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76      || pCur->aOv
29f80 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
29f90 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  xtPage.         
29fa0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
29fb0 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  DB );.      pCur
29fc0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
29fd0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  ] = nextPage;.. 
29fe0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
29ff0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
2a000 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
2a010 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
2a020 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
2a030 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
2a040 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
2a050 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
2a060 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
2a070 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
2a080 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
2a090 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
2a0a0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
2a0b0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
2a0c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
2a0d0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
2a0e0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
2a0f0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
2a100 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
2a110 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
2a120 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
2a130 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
2a140 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
2a150 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2a160 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
2a170 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42  assert( pCur->pB
2a180 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64  tree->db==pBt->d
2a190 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b );.        if(
2a1a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2a1b0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
2a1c0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
2a1d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
2a1e0 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
2a1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a200 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2a210 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
2a220 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
2a230 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
2a240 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
2a250 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
2a260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a270 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
2a280 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
2a290 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
2a2a0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
2a2b0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
2a2c0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
2a2d0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
2a2e0 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
2a2f0 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
2a300 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2a310 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
2a320 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
2a330 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
2a340 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d      /* File from
2a350 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69 72   which to do dir
2a360 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65 61  ect overflow rea
2a370 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  d */.#endif.    
2a380 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
2a390 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
2a3a0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
2a3b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2a3c0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
2a3d0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
2a3e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a3f0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
2a400 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
2a410 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
2a420 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
2a430 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2a440 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
2a450 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
2a460 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
2a470 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
2a480 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
2a490 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
2a4a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2a4b0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
2a4c0 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   3) there is no 
2a4d0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
2a4e0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2a4f0 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
2a500 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
2a510 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
2a520 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
2a530 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
2a540 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
2a550 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
2a560 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
2a570 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2a580 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
2a590 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
2a5a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a5b0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
2a5c0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
2a5d0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
2a5e0 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
2a5f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
2a600 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
2a610 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
2a620 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
2a630 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
2a640 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
2a650 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
2a660 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
2a670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
2a680 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a690 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
2a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
2a6d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
2a6e0 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
2a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
2a720 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
2a730 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
2a740 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
2a750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2a760 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
2a770 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
2a780 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
2a790 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
2a7a0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
2a7b0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
2a7c0 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c  lite3PagerUseWal
2a7d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
2a7e0 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f 2a  xtPage)       /*
2a7f0 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
2a800 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70   && &pBuf[-4]>=p
2a810 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20  BufStart        
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
2a840 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2a850 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
2a860 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
2a870 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
2a880 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -4];.          a
2a890 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70  ssert( aWrite>=p
2a8a0 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20  BufStart );     
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36      /* due to (6
2a8d0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
2a8e0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
2a8f0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
2a900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a910 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
2a920 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
2a930 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
2a940 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
2a950 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
2a960 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
2a970 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a980 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
2a990 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
2a9a0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
2a9b0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
2a9c0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
2a9d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2a9e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
2a9f0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
2aa00 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f               (eO
2aa20 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  p==0 ? PAGER_GET
2aa30 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
2aa40 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2aa50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2aa60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2aa70 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
2aa80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2aa90 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
2aab0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2aac0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
2aad0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
2aae0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
2aaf0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
2ab00 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
2ab10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2ab20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2ab30 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
2ab40 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
2ab50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
2ab60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ab70 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
2ab80 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20       if( amt==0 
2ab90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2aba0 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
2abb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2abc0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2abd0 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20      iIdx++;.    
2abe0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
2abf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
2ac00 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
2ac10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2ac20 5f 42 4b 50 54 3b 20 2f 2a 20 4f 76 65 72 66 6c  _BKPT; /* Overfl
2ac30 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
2ac40 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 7d  ematurely */.  }
2ac50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ac60 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
2ac70 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   of the payload 
2ac80 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77  for the row at w
2ac90 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72  hich that cursor
2aca0 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74   pCur is current
2acb0 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  ly.** pointing. 
2acc0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
2acd0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
2ace0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
2acf0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
2ad00 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
2ad10 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61  "..**.** pCur ca
2ad20 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  n be pointing to
2ad30 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20   either a table 
2ad40 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  or an index b-tr
2ad50 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69  ee..** If pointi
2ad60 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74  ng to a table bt
2ad70 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ree, then the co
2ad80 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73  ntent section is
2ad90 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43   read.  If.** pC
2ada0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
2adb0 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  o an index b-tre
2adc0 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73  e then the key s
2add0 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a  ection is read..
2ade0 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65  **.** For sqlite
2adf0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c  3BtreePayload(),
2ae00 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
2ae10 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
2ae20 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  r is pointing.**
2ae30 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
2ae40 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46  in the table.  F
2ae50 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2ae60 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c  ayloadChecked(),
2ae70 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d   the.** cursor m
2ae80 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20  ight be invalid 
2ae90 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  or might need to
2aea0 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66   be restored bef
2aeb0 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a  ore being read..
2aec0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2aed0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
2aee0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
2aef0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
2af00 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
2af10 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
2af20 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
2af30 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
2af40 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
2af50 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
2af60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2af70 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72  Payload(BtCursor
2af80 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
2af90 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
2afa0 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
2afb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2afc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2afd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2afe0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2aff0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2b000 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
2b010 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
2b020 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
2b030 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b040 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
2b050 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2b060 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
2b070 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2b080 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
2b090 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2b0a0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
2b0b0 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74 20  ** This variant 
2b0c0 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  of sqlite3BtreeP
2b0d0 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65  ayload() works e
2b0e0 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f  ven if the curso
2b0f0 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20  r has not.** in 
2b100 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  the CURSOR_VALID
2b110 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f   state.  It is o
2b120 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
2b130 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
2b140 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  d().** interface
2b150 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
2b160 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2b170 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  B.static SQLITE_
2b180 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63  NOINLINE int acc
2b190 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
2b1a0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
2b1b0 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65  Cur,.  u32 offse
2b1c0 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20  t,.  u32 amt,.  
2b1d0 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20  void *pBuf.){.  
2b1e0 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70  int rc;.  if ( p
2b1f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b200 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2b210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b220 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73  _ABORT;.  }.  as
2b230 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b240 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b250 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52 65  ;.  rc = btreeRe
2b260 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2b270 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ion(pCur);.  ret
2b280 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63  urn rc ? rc : ac
2b290 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2b2a0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
2b2b0 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  Buf, 0);.}.int s
2b2c0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2b2d0 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72 73  adChecked(BtCurs
2b2e0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
2b2f0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
2b300 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66  oid *pBuf){.  if
2b310 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b320 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2b330 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72 73      assert( curs
2b340 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b350 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75  Cur) );.    retu
2b360 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
2b370 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
2b380 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
2b390 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2b3a0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  n accessPayloadC
2b3b0 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66  hecked(pCur, off
2b3c0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b  set, amt, pBuf);
2b3d0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
2b3e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2b3f0 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
2b400 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2b410 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
2b420 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
2b430 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
2b440 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
2b450 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2b460 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
2b470 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
2b480 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
2b490 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
2b4a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
2b4b0 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
2b4c0 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
2b4d0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
2b4e0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
2b4f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2b500 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
2b510 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
2b520 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
2b530 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
2b540 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
2b550 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
2b560 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
2b570 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
2b580 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
2b590 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
2b5a0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
2b5b0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
2b5c0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
2b5d0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
2b5e0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
2b5f0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
2b600 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
2b610 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
2b620 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
2b630 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
2b640 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
2b650 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
2b660 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
2b670 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
2b680 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
2b690 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2b6a0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
2b6b0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
2b6c0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
2b6d0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
2b6e0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
2b6f0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
2b700 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
2b710 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
2b720 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
2b730 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
2b740 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
2b750 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
2b760 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2b770 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
2b780 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
2b790 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
2b7a0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
2b7b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
2b7c0 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
2b7d0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
2b7e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b7f0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
2b800 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
2b810 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
2b820 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
2b830 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2b840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
2b850 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
2b860 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
2b870 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
2b880 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
2b890 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
2b8a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b8b0 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
2b8c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b8d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b8e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b8f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2b900 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2b910 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2b920 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b930 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b940 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b950 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
2b960 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2b970 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2b980 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b990 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2b9a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2b9b0 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65  oad>pCur->apPage
2b9c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
2b9d0 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
2b9e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
2b9f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2ba00 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  oad<pCur->apPage
2ba10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
2ba20 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50  DataEnd ||CORRUP
2ba30 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28  T_DB);.  amt = (
2ba40 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67  int)(pCur->apPag
2ba50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2ba60 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
2ba70 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b  >info.pPayload);
2ba80 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
2ba90 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61  o.nLocal<amt ) a
2baa0 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
2bab0 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20  nLocal;.  *pAmt 
2bac0 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  = amt;.  return 
2bad0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
2bae0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
2baf0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
2bb00 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
2bb10 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
2bb20 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
2bb30 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
2bb40 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
2bb50 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
2bb60 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
2bb70 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
2bb80 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2bb90 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2bba0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
2bbb0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2bbc0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
2bbd0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
2bbe0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
2bbf0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
2bc00 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
2bc10 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
2bc20 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
2bc30 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
2bc40 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
2bc50 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
2bc60 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
2bc70 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2bc80 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
2bc90 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
2bca0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
2bcb0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
2bcc0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
2bcd0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
2bce0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
2bcf0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
2bd00 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
2bd10 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
2bd20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
2bd30 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
2bd40 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2bd50 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
2bd60 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2bd70 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2bd80 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2bd90 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
2bda0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2bdb0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
2bdc0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2bdd0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
2bde0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
2bdf0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
2be00 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
2be10 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
2be20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2be30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2be40 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
2be50 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
2be60 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
2be70 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
2be80 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
2be90 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
2bea0 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
2beb0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
2bec0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
2bed0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
2bee0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
2bef0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
2bf00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bf10 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
2bf20 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2bf30 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
2bf40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2bf50 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2bf60 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2bf70 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2bf80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2bf90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2bfa0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2bfb0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
2bfc0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
2bfd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2bfe0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
2bff0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2c000 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
2c010 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
2c020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2c030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
2c040 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c050 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2c060 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2c070 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2c080 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2c090 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c0a0 3e 69 50 61 67 65 2b 2b 5d 20 3d 20 70 43 75 72  >iPage++] = pCur
2c0b0 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 69 78  ->ix;.  pCur->ix
2c0c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
2c0d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2c0e0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
2c0f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c100 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c120 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50  pCur, pCur->curP
2c130 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23  agerFlags);.}..#
2c140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c150 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
2c160 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
2c170 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
2c180 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
2c190 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
2c1a0 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
2c1b0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2c1c0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
2c1d0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
2c1e0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
2c1f0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
2c200 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
2c210 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2c220 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
2c230 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
2c240 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
2c250 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
2c260 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
2c270 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2c280 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
2c290 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
2c2a0 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
2c2b0 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
2c2c0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
2c2d0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
2c2e0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
2c2f0 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
2c300 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
2c330 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
2c340 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
2c350 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
2c360 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
2c370 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2c380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
2c390 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
2c3a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2c3b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
2c3c0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
2c3d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
2c3e0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c3f0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
2c400 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
2c410 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
2c420 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
2c430 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
2c440 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
2c450 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
2c460 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2c470 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
2c480 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
2c490 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
2c4a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
2c4b0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
2c4c0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
2c4d0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
2c4e0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
2c4f0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
2c500 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
2c510 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2c520 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
2c530 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
2c540 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
2c550 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
2c560 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
2c570 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
2c580 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c590 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c5a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c5b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c5c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2c5d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
2c5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c5f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c600 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2c610 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2c620 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2c630 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2c640 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2c650 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2c660 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
2c670 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c680 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73  >pgno.  );.  tes
2c690 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49  tcase( pCur->aiI
2c6a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2c6b0 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ] > pCur->apPage
2c6c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d  [pCur->iPage-1]-
2c6d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72  >nCell );.  pCur
2c6e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2c6f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2c700 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2c710 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2c720 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
2c730 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  ix = pCur->aiIdx
2c740 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
2c750 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
2c760 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
2c770 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
2c780 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
2c790 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2c7a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2c7b0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2c7c0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2c7d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2c7e0 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2c7f0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2c800 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2c810 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2c820 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2c830 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2c840 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2c850 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2c860 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2c870 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2c880 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2c890 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2c8a0 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2c8b0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2c8c0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2c8d0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2c8e0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2c8f0 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2c900 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2c910 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2c920 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2c930 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2c940 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2c950 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
2c960 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
2c970 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2c980 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
2c990 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
2c9a0 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
2c9b0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
2c9c0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
2c9d0 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
2c9e0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
2c9f0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
2ca00 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2ca10 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
2ca20 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2ca30 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
2ca40 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
2ca50 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
2ca60 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
2ca70 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
2ca80 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
2ca90 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
2caa0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
2cab0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
2cac0 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
2cad0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
2cae0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2caf0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2cb00 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
2cb10 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
2cb20 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
2cb30 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
2cb40 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
2cb50 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
2cb60 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
2cb70 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
2cb80 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
2cb90 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
2cba0 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
2cbb0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
2cbc0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2cbd0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
2cbe0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
2cbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2cc00 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2cc10 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2cc20 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2cc30 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
2cc40 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2cc50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2cc60 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
2cc70 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2cc80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2cc90 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
2cca0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2ccb0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
2ccc0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
2ccd0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
2cce0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2ccf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2cd00 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
2cd10 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2cd20 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
2cd30 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
2cd40 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
2cd50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
2cd60 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2cd70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
2cd80 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2cd90 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2cda0 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2cdb0 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  do{.        asse
2cdc0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2cdd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
2cde0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
2cdf0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2ce00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ce10 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
2ce20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2ce30 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  >iPage);.      g
2ce40 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20  oto skip_init;. 
2ce50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2ce60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ce70 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
2ce80 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2ce90 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
2cea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ceb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2cec0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2ced0 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20  =(-1) );.    rc 
2cee0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2cef0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2cf00 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2cf10 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
2cf20 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
2cf40 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
2cf50 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
2cf60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cf70 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2cf80 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2cf90 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74 75  LID;.       retu
2cfa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2cfb0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
2cfc0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
2cfd0 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
2cfe0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
2cff0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
2d000 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2d010 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2d020 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
2d030 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
2d040 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
2d050 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2d060 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
2d070 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
2d080 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
2d090 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
2d0a0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
2d0b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2d0c0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
2d0d0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
2d0e0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
2d0f0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
2d100 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
2d110 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
2d120 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
2d130 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
2d140 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
2d150 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
2d160 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
2d170 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
2d180 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
2d190 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
2d1a0 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
2d1b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2d1c0 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
2d1d0 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
2d1e0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
2d1f0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
2d200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d210 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
2d220 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
2d230 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
2d240 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
2d250 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
2d260 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
2d270 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
2d280 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2d290 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
2d2a0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
2d2b0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
2d2c0 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
2d2d0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2d2e0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2d2f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d300 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d310 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  T;.  }..skip_ini
2d320 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20  t:  .  pCur->ix 
2d330 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
2d340 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2d350 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2d360 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2d370 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2d380 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
2d390 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2d3a0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66 28  apPage[0];.  if(
2d3b0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
2d3c0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2d3d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2d3e0 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
2d3f0 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
2d400 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
2d410 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
2d420 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
2d430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d440 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
2d450 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
2d460 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
2d470 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
2d480 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
2d490 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2d4a0 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
2d4b0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
2d4c0 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
2d4d0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2d4e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2d4f0 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
2d500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2d510 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2d520 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2d530 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2d540 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2d550 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2d560 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2d570 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2d580 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2d590 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2d5a0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2d5b0 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2d5c0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2d5d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2d5e0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2d5f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2d600 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2d610 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d620 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2d630 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2d640 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d650 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d660 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2d670 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2d680 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2d690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d6a0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2d6b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d6c0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
2d6d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d6e0 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2d6f0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
2d700 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2d710 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29  pPage, pCur->ix)
2d720 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
2d730 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2d740 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2d750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2d760 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2d770 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
2d780 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2d790 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2d7a0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
2d7b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2d7c0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
2d7d0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
2d7e0 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
2d7f0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
2d800 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2d810 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
2d820 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2d830 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
2d840 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
2d850 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
2d860 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
2d870 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
2d880 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2d890 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
2d8a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
2d8b0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
2d8c0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2d8d0 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
2d8e0 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
2d8f0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2d900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d910 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2d920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2d930 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2d940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d950 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2d960 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
2d970 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d980 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d990 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d9a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d9b0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2d9c0 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
2d9d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d9e0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
2d9f0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2da00 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2da10 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2da20 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2da30 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2da40 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2da50 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2da60 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2da70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2da80 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2da90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2daa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2dab0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2dac0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2dad0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2dae0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2daf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2db00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2db10 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2db20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2db30 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2db40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2db50 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2db60 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2db70 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2db80 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2db90 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2dba0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2dbb0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2dbc0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2dbd0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2dbe0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2dbf0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2dc00 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2dc10 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2dc20 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2dc30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2dc40 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2dc50 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2dc60 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2dc70 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2dc80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dc90 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
2dca0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2dcb0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2dcc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2dcd0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2dce0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dcf0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2dd00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2dd10 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
2dd20 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2dd30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2dd40 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2dd50 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
2dd60 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
2dd70 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
2dd80 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2dd90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2dda0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2ddb0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
2ddc0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2ddd0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2dde0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2ddf0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2de00 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2de10 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2de20 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2de30 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2de40 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2de50 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2de60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2de70 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
2de80 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2de90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
2dea0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2deb0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2dec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ded0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2dee0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2def0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
2df00 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2df10 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
2df20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2df30 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
2df40 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
2df50 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2df60 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
2df70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2df80 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2df90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2dfa0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
2dfb0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
2dfc0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
2dfd0 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
2dfe0 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
2dff0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
2e000 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
2e010 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
2e020 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
2e030 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
2e040 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2e050 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2e060 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
2e070 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
2e080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e090 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43  rt( pCur->ix==pC
2e0a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e0b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
2e0c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e0d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e0e0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
2e0f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
2e100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e110 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
2e120 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2e130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e140 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
2e150 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2e160 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2e170 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2e180 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2e190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e1a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2e1b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2e1c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
2e1d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2e1e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e1f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2e200 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2e210 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2e220 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2e230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2e240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e250 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2e260 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
2e270 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
2e280 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2e290 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2e2a0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
2e2b0 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
2e2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e2d0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2e2e0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
2e2f0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
2e300 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
2e310 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
2e320 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
2e330 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
2e340 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
2e350 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
2e360 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
2e370 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
2e380 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
2e390 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
2e3a0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
2e3b0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
2e3c0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
2e3d0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
2e3e0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
2e3f0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
2e400 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2e410 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
2e420 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
2e430 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
2e440 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
2e450 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
2e460 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
2e470 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
2e480 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
2e490 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
2e4a0 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
2e4b0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
2e4c0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
2e4d0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
2e4e0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
2e4f0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
2e500 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
2e510 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
2e520 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
2e530 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
2e540 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
2e550 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
2e560 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
2e570 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2e580 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
2e590 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2e5a0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2e5b0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2e5c0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2e5d0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
2e5e0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2e5f0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
2e600 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e620 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
2e630 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
2e640 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
2e650 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
2e660 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
2e670 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2e680 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2e690 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
2e6b0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
2e6c0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2e6d0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
2e6e0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2e6f0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2e700 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2e710 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2e720 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
2e730 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2e740 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e  ey..**.** For in
2e750 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20  dex tables, the 
2e760 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20  pIdxKey->eqSeen 
2e770 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2e780 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78  1 if there.** ex
2e790 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e  ists an entry in
2e7a0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2e7b0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2e7c0 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e  pIdxKey.  .*/.in
2e7d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2e7e0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2e7f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2e800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e810 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2e820 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2e830 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2e840 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2e850 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2e860 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2e870 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2e880 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2e890 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2e8a0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2e8b0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2e8c0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2e8d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8f0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2e900 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2e910 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2e920 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2e930 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2e940 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e950 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e960 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e970 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e980 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2e990 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2e9a0 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
2e9b0 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
2e9c0 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
2e9d0 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73  Info==0) );.  as
2e9e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2e9f0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2ea00 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29   || (pIdxKey==0)
2ea10 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ==(pCur->curIntK
2ea20 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ey!=0) );..  /* 
2ea30 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2ea40 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2ea50 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2ea60 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2ea70 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2ea80 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2ea90 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2eaa0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2eab0 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26   pIdxKey==0.   &
2eac0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
2ead0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
2eae0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2eaf0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
2eb00 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66  )!=0.  ){.    if
2eb10 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2eb20 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2eb30 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2eb40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2eb50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2eb60 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2eb70 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2eb80 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
2eb90 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2eba0 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20  tLast)!=0 ){.   
2ebb0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
2ebc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ebd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ebe0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   }.      /* If t
2ebf0 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79  he requested key
2ec00 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   is one more tha
2ec10 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b  n the previous k
2ec20 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ey, then.      *
2ec30 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65  * try to get the
2ec40 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  re using sqlite3
2ec50 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68  BtreeNext() rath
2ec60 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20  er than a full. 
2ec70 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73       ** binary s
2ec80 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20  earch.  This is 
2ec90 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2eca0 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65  only.  The corre
2ecb0 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20  ct answer.      
2ecc0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61  ** is still obta
2ecd0 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69  ined without thi
2ece0 73 20 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69  s ase, only a li
2ecf0 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c  ttle more slowel
2ed00 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
2ed10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31  Cur->info.nKey+1
2ed20 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75  ==intKey && !pCu
2ed30 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2ed40 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2ed50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2ed60 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ed70 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2ed80 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2ed90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2eda0 20 69 66 28 20 2a 70 52 65 73 3d 3d 30 20 29 7b   if( *pRes==0 ){
2edb0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65  .          getCe
2edc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
2edd0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
2ede0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2edf0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2ee00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ee10 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2ee20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2ee40 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2ee50 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ee60 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2ee70 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2ee80 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2ee90 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2eea0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2eeb0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2eec0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2eed0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2eee0 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2eef0 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2ef00 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2ef10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2ef20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ef30 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2ef40 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2ef50 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2ef60 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2ef70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2ef80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2ef90 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2efa0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2efb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2efc0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2efd0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2efe0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2eff0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f000 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2f010 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2f020 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2f030 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2f040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2f050 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2f060 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2f070 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2f080 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2f090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2f0a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2f0b0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2f0c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2f0d0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2f0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f0f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2f100 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2f110 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2f120 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2f130 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2f140 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2f150 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2f160 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2f170 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2f180 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2f190 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2f1a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2f1b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2f1c0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2f1f0 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2f200 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2f210 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2f220 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2f230 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2f240 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2f250 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2f260 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2f270 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2f280 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2f290 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2f2a0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2f2b0 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2f2c0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2f2d0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2f2e0 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2f2f0 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2f300 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2f310 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2f320 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2f330 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2f340 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2f350 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2f360 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2f370 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2f380 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2f390 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2f3a0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2f3b0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2f3c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f3d0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2f3e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2f3f0 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2f400 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2f410 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2f420 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2f430 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2f440 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2f450 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2f460 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2f470 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2f480 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2f490 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2f4a0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2f4b0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2f4c0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2f4d0 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2f4e0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2f4f0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2f500 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2f510 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2f520 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2f530 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2f540 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2f550 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2f560 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2f570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f580 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2f590 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2f5a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2f5b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2f5c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f5d0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2f5e0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2f5f0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2f600 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2f610 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2f620 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2f630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2f640 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2f650 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2f660 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2f670 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2f680 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2f690 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2f6a0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2f6b0 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2f6c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f6d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f6e0 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2f6f0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2f700 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2f710 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2f720 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f730 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2f740 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2f750 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2f760 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2f770 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f780 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2f790 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2f7a0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2f7b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2f7c0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2f7d0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2f7e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2f800 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2f810 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2f820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2f830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2f840 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f850 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2f860 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2f870 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2f880 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2f890 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2f8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2f8b0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2f8c0 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2f8d0 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2f8e0 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2f8f0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2f900 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2f910 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2f920 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2f930 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2f940 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2f950 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2f960 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2f970 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2f980 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2f990 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2f9a0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2f9b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2f9c0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2f9d0 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2f9e0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2f9f0 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2fa00 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2fa10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2fa20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2fa30 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2fa40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2fa50 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2fa60 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2fa70 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2fa80 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2fa90 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2faa0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2fab0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2fac0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2fad0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2fae0 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2faf0 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2fb00 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2fb10 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2fb20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2fb30 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2fb40 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2fb50 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2fb60 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2fb70 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2fb80 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2fb90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2fba0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2fbb0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2fbc0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2fbd0 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2fbe0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2fbf0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2fc00 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2fc10 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2fc20 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2fc30 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2fc40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2fc50 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2fc60 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2fc70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fc80 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2fc90 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2fca0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2fcb0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2fcc0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2fcd0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2fce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2fcf0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2fd00 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2fd10 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2fd20 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2fd30 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2fd40 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2fd50 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2fd60 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2fd70 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2fd80 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2fd90 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2fda0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2fdb0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2fdc0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2fdd0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2fde0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2fdf0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2fe00 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2fe10 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2fe20 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2fe30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2fe40 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2fe50 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2fe60 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2fe70 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2fe80 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2fe90 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2fea0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2feb0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2fec0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2fed0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2fee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2fef0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2ff00 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2ff10 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2ff20 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2ff30 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2ff40 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2ff50 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2ff60 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2ff70 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2ff80 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2ff90 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2ffa0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2ffb0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2ffc0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2ffd0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2ffe0 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2fff0 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
30000 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
30010 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
30020 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
30030 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
30040 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
30050 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
30060 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
30070 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
30080 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
30090 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
300a0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
300b0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
300c0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
300d0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
300e0 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
300f0 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
30100 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
30110 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30120 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
30130 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
30140 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
30150 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
30160 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
30170 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
30180 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
30190 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
301a0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
301b0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
301c0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
301d0 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
301e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
301f0 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
30200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30210 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30220 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
30230 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
30240 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
30250 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
30260 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
30270 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
30280 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
30290 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
302a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
302b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
302c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
302d0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
302e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
302f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
30300 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
30310 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
30320 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
30330 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
30340 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
30350 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
30360 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
30370 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
30380 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  fl;.          if
30390 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
303a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
303b0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
303c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
303d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
303e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
303f0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
30400 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
30410 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
30420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30430 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
30440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30450 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
30460 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
30470 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
30480 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
30490 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
304a0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
304b0 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
304c0 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
304d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
304e0 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
304f0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
30500 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
30510 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
30520 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
30530 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
30540 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
30550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
30560 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
30570 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
30580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
305a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
305b0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
305c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
305d0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
305e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
305f0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
30600 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
30610 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
30620 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
30630 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
30640 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
30650 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
30660 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
30670 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
30680 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
30690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
306a0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
306b0 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
306c0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
306d0 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
306e0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
306f0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
30700 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30720 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ix<pCur->apPage[
30730 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
30740 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
30750 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
30760 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
30770 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
30780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
30790 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
307a0 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
307b0 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
307c0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
307d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
307e0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
307f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
30800 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
30810 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
30820 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
30830 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
30840 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
30850 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
30860 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  x = (u16)lwr;.  
30870 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
30880 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
30890 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
308a0 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
308b0 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
308c0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
308d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
308e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
308f0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
30900 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
30910 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
30920 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
30930 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
30940 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
30950 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
30960 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
30970 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
30980 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
30990 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
309a0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
309b0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
309c0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
309d0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
309e0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
309f0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
30a00 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
30a10 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
30a20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
30a30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
30a40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
30a50 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
30a60 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
30a70 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
30a80 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
30a90 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
30aa0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
30ab0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
30ac0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
30ad0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
30ae0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
30af0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
30b00 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
30b10 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
30b20 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
30b30 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
30b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30b50 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f  n an estimate fo
30b60 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
30b70 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
30b80 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  e that pCur is.*
30b90 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
30ba0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
30bb0 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65  e number if no e
30bc0 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65  stimate is curre
30bd0 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62  ntly .** availab
30be0 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  le..*/.i64 sqlit
30bf0 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45  e3BtreeRowCountE
30c00 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
30c10 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75  r){.  i64 n;.  u
30c20 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  8 i;..  assert( 
30c30 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
30c40 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
30c50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
30c60 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
30c70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
30c80 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65  ) );..  /* Curre
30c90 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66  ntly this interf
30ca0 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ace is only call
30cb0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53  ed by the OP_IfS
30cc0 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f  maller.  ** opco
30cd0 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20  de, and it that 
30ce0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
30cf0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76  will always be v
30d00 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69  alid and.  ** wi
30d10 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20  ll always point 
30d20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20  to a leaf node. 
30d30 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
30d40 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
30d50 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74  SOR_VALID) ) ret
30d60 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45  urn -1;.  if( NE
30d70 56 45 52 28 70 43 75 72 2d 3e 61 70 50 61 67 65  VER(pCur->apPage
30d80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
30d90 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
30da0 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31 2c   -1;..  for(n=1,
30db0 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69   i=0; i<=pCur->i
30dc0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
30dd0 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  n *= pCur->apPag
30de0 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  e[i]->nCell;.  }
30df0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
30e00 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
30e10 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
30e20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
30e30 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
30e40 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
30e50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
30e60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
30e70 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
30e80 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
30e90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
30ea0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
30eb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
30ec0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
30ed0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
30ee0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
30ef0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
30f00 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
30f10 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
30f20 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
30f30 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
30f40 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
30f50 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
30f60 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
30f70 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
30f80 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
30f90 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
30fa0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
30fb0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
30fc0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
30fd0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
30fe0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
30ff0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
31000 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
31010 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
31020 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
31030 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
31040 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
31050 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
31060 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
31070 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
31080 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
31090 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
310a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
310b0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
310c0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
310d0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
310e0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
310f0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
31100 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
31110 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
31120 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
31130 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
31140 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
31150 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
31160 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
31170 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
31180 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
31190 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
311a0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
311b0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
311c0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
311d0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
311e0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
311f0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
31200 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
31210 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
31220 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
31230 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
31240 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
31250 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
31260 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
31270 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
31280 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
31290 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
312a0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
312b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
312c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
312d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
312e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
312f0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
31300 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
31310 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
31320 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
31330 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
31340 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
31350 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
31360 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
31370 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
31380 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
31390 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
313a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
313b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
313c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
313d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
313e0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
313f0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
31400 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
31410 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
31420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31430 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
31440 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
31450 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
31460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
31470 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
31480 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
31490 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
314a0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
314b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
314c0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
314d0 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
314e0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
314f0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
31500 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
31510 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
31520 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
31530 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
31540 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
31550 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
31560 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
31570 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61   ++pCur->ix;.  a
31580 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
31590 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
315a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
315b0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
315c0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
315d0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
315e0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
315f0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
31600 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
31610 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
31620 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
31630 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
31640 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
31650 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
31660 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
31670 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
31680 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
31690 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
316a0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
316b0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
316c0 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
316d0 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
316e0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
316f0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
31700 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
31710 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
31720 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
31730 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
31740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
31750 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
31760 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
31770 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
31780 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
31790 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
317a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
317b0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
317c0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
317d0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
317e0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
317f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
31800 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
31810 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
31820 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
31830 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
31840 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31850 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
31860 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
31870 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
31880 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
31890 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
318a0 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65   pCur->ix>=pPage
318b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
318c0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
318d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
318e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
318f0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
31900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
31930 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
31940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31950 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
31960 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
31970 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
31980 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
31990 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
319a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
319b0 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
319c0 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
319d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
319e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
319f0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
31a00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
31a10 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
31a20 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
31a30 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
31a40 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
31a50 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
31a60 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
31a70 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
31a80 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
31a90 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
31aa0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
31ab0 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
31ac0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
31ad0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
31ae0 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
31af0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
31b00 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
31b10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
31b20 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
31b30 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
31b40 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
31b50 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
31b60 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
31b70 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
31b80 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
31b90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
31bb0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
31bc0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
31bd0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
31be0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
31bf0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
31c00 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
31c10 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
31c20 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
31c30 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
31c40 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
31c50 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
31c60 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
31c70 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
31c80 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
31c90 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
31ca0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
31cb0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
31cc0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
31cd0 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
31ce0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
31cf0 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
31d00 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
31d10 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
31d20 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
31d30 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
31d40 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
31d50 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
31d60 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
31d70 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
31d80 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
31d90 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
31da0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
31db0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
31dc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
31dd0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
31de0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
31df0 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
31e00 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
31e10 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
31e20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
31e30 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
31e40 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
31e50 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
31e60 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
31e70 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
31e80 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
31e90 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
31ea0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
31eb0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
31ec0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
31ed0 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
31ee0 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
31ef0 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
31f00 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
31f10 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
31f20 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
31f30 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
31f40 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
31f50 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
31f60 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
31f70 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
31f80 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
31f90 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
31fa0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
31fb0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
31fc0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
31fd0 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
31fe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
31ff0 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
32000 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
32010 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
32020 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
32030 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
32040 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
32050 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
32060 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
32070 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
32080 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
32090 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
320a0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
320b0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
320c0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
320d0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
320e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
320f0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
32100 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
32110 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
32120 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
32130 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
32140 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
32150 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
32160 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
32170 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
32180 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32190 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
321a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
321b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
321c0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
321d0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
321e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
321f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
32220 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
32230 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
32240 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
32250 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
32260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32280 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
32290 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
322a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
322b0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
322c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
322d0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
322e0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
322f0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
32300 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
32310 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
32320 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
32330 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
32340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32350 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
32360 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
32370 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
32380 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
32390 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
323a0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
323b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
323c0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
323d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
323e0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b   idx = pCur->ix;
323f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
32400 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
32410 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
32420 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
32430 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
32440 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
32450 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
32460 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
32470 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
32480 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x==0 ){.      if
32490 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
324a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
324b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
324c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
324d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
324e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
324f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
32500 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
32510 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
32520 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
32530 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
32540 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
32550 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
32560 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
32570 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
32580 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
32590 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
325a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
325b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
325c0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
325d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
325e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
325f0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
32600 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
32610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
32620 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
32630 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
32640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32650 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
32660 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
32670 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
32680 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
32690 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
326a0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
326b0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
326c0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
326d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
326e0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
326f0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
32700 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
32710 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
32720 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
32730 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
32740 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
32750 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
32760 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
32770 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
32780 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
32790 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
327a0 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20  ur->ix==0.   || 
327b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
327c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
327d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
327e0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
327f0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
32800 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
32810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32820 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
32830 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
32840 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
32850 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
32860 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
32870 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
32880 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
32890 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
328a0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
328b0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
328c0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
328d0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
328e0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
328f0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
32900 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
32910 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
32920 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
32930 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
32940 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
32950 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
32960 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
32970 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32980 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
32990 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
329a0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
329b0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
329c0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
329d0 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
329e0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
329f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
32a00 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
32a10 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
32a20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
32a30 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
32a40 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
32a50 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32a60 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
32a70 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
32a80 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
32a90 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
32aa0 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
32ab0 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
32ac0 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
32ad0 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
32ae0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
32af0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
32b00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
32b10 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
32b20 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
32b30 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
32b40 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
32b50 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
32b60 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
32b70 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
32b80 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
32b90 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
32ba0 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
32bb0 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
32bc0 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
32bd0 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
32be0 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
32bf0 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
32c00 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
32c10 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
32c20 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
32c30 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
32c40 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
32c50 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
32c60 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
32c70 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
32c80 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
32c90 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
32ca0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
32cb0 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
32cc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32cd0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
32ce0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
32cf0 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
32d00 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
32d10 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
32d20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
32d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
32d40 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
32d50 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
32d60 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
32d70 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
32d80 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
32d90 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
32da0 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
32db0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
32dc0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
32dd0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
32de0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
32df0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
32e00 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
32e10 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
32e20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
32e30 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
32e40 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
32e50 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
32e60 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
32e70 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
32e80 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
32e90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
32ea0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
32eb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32ec0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
32ed0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
32ee0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
32ef0 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
32f00 26 20 52 45 51 55 49 52 45 5f 50 54 52 4d 41 50  & REQUIRE_PTRMAP
32f10 20 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d   ) );.  pPage1 =
32f20 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
32f30 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
32f40 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
32f50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
32f60 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
32f70 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
32f80 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
32f90 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
32fa0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
32fb0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
32fc0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
32fd0 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
32fe0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
32ff0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
33000 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
33010 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 49  age-1 );.  if( I
33020 53 43 4f 4e 43 55 52 52 45 4e 54 3d 3d 30 20 26  SCONCURRENT==0 &
33030 26 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  & n>=mxPage ){. 
33040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33050 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33060 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20   }..  /* Ensure 
33070 70 61 67 65 20 31 20 69 73 20 77 72 69 74 61 62  page 1 is writab
33080 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
33090 6e 20 77 69 6c 6c 20 65 69 74 68 65 72 20 63 68  n will either ch
330a0 61 6e 67 65 20 74 68 65 20 6e 75 6d 62 65 72 0a  ange the number.
330b0 20 20 2a 2a 20 6f 66 20 70 61 67 65 73 20 69 6e    ** of pages in
330c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
330d0 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
330e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
330f0 20 53 69 6e 63 65 20 62 6f 74 68 0a 20 20 2a 2a   Since both.  **
33100 20 6f 66 20 74 68 65 73 65 20 6f 70 65 72 61 74   of these operat
33110 69 6f 6e 73 20 69 6e 76 6f 6c 76 65 20 6d 6f 64  ions involve mod
33120 69 66 79 69 6e 67 20 70 61 67 65 20 31 20 68 65  ifying page 1 he
33130 61 64 65 72 20 66 69 65 6c 64 73 2c 20 70 61 67  ader fields, pag
33140 65 20 31 0a 20 20 2a 2a 20 77 69 6c 6c 20 64 65  e 1.  ** will de
33150 66 69 6e 69 74 65 6c 79 20 62 65 20 77 72 69 74  finitely be writ
33160 74 65 6e 20 62 79 20 74 68 69 73 20 74 72 61 6e  ten by this tran
33170 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  saction. If this
33180 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52 45 4e   is an CONCURREN
33190 54 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  T.  ** transacti
331a0 6f 6e 2c 20 65 6e 73 75 72 65 20 74 68 65 20 42  on, ensure the B
331b0 74 72 65 65 50 74 72 6d 61 70 20 73 74 72 75 63  treePtrmap struc
331c0 74 75 72 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ture has been al
331d0 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 72  located.  */.  r
331e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
331f0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
33200 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
33210 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
33220 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
33230 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
33240 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
33250 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
33260 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
33270 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
33280 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
33290 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
332a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
332b0 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
332c0 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
332d0 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
332e0 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
332f0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
33300 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
33310 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
33320 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
33330 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
33340 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
33350 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
33360 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
33370 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
33380 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
33390 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
333a0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
333b0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
333c0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
333d0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
333e0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
333f0 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
33400 20 20 61 73 73 65 72 74 28 20 49 53 41 55 54 4f    assert( ISAUTO
33410 56 41 43 55 55 4d 21 3d 49 53 43 4f 4e 43 55 52  VACUUM!=ISCONCUR
33420 52 45 4e 54 20 29 3b 0a 20 20 20 20 20 20 69 66  RENT );.      if
33430 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
33440 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  {.        if( ne
33450 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
33460 20 20 20 20 20 20 20 20 20 20 75 38 20 65 54 79            u8 eTy
33470 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  pe;.          as
33480 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
33490 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
334a0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
334b0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  uum );.         
334c0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
334d0 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
334e0 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
334f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33500 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
33510 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
33520 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
33530 20 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63             searc
33540 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
33550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33570 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
33580 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
33590 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
335a0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
335b0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
335c0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
335d0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
335e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
335f0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
33600 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
33610 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
33620 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
33630 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
33640 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
33650 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
33660 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
33670 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
33680 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
33690 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
336a0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
336b0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
336c0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
336d0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
336e0 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
336f0 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
33700 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
33710 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
33720 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
33730 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
33740 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
33750 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
33760 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
33770 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
33780 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
33790 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
337a0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
337b0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
337c0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
337d0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
337e0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
337f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
33800 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30  DENCE-OF: R-0150
33810 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73  6-11053 The firs
33820 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  t integer on a f
33830 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
33840 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ge.        ** is
33850 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
33860 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
33870 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
33880 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a   in the list or.
33890 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20          ** zero 
338a0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  if this is the l
338b0 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ast freelist tru
338c0 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nk page. */.    
338d0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
338e0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
338f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
33900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33910 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
33920 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38  F: R-59841-13798
33930 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
33940 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
33950 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20  t offset 32.    
33960 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68      ** stores th
33970 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
33980 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
33990 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  of the freelist,
339a0 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20   or zero if.    
339b0 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c      ** the freel
339c0 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ist is empty. */
339d0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
339e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
339f0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
33a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
33a10 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
33a20 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
33a30 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
33a40 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e  e || nSearch++ >
33a50 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   n ){.        rc
33a60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33a70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
33a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
33a90 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33aa0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
33ab0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
33ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
33ad0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
33ae0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
33af0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
33b00 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
33b10 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
33b20 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
33b30 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
33b40 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
33b50 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
33b60 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
33b70 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
33b80 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
33b90 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
33ba0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
33bb0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
33bc0 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
33bd0 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
33be0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
33bf0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
33c00 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
33c10 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
33c20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
33c30 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
33c40 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
33c50 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
33c60 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
33c70 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
33c80 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
33c90 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
33ca0 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
33cb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
33cc0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
33cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
33ce0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
33cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33d00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
33d10 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
33d20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
33d30 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
33d40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
33d50 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
33d60 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
33d70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
33d80 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
33d90 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
33da0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
33db0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33dc0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
33dd0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
33de0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33df0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
33e00 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
33e10 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
33e20 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
33e30 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
33e40 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
33e50 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
33e60 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
33e70 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
33e80 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
33e90 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
33ea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
33eb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
33ec0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
33ed0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
33ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33ef0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33f00 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
33f10 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
33f20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
33f30 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
33f40 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
33f50 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
33f60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
33f70 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
33f80 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
33f90 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
33fa0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
33fb0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
33fc0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
33fd0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
33fe0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
33ff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
34000 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
34010 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
34020 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
34030 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
34040 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34050 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34060 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
34070 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34080 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
34090 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
340a0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
340b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
340c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
340d0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
340e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
340f0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
34100 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
34110 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
34120 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
34130 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
34140 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34150 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
34160 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34170 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34190 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
341a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
341b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
341c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
341d0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
341e0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
341f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
34200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34220 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
34230 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
34240 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
34250 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
34260 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
34270 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
34280 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
34290 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
342a0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
342b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
342c0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
342d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
342e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
342f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
34300 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
34310 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
34320 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
34330 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
34340 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
34350 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
34360 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34370 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
34380 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
34390 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
343a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
343b0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
343c0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
343d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
343e0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
343f0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
34400 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
34410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
34420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
34440 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
34450 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
34460 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
34470 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34480 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
34490 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
344a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
344b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
344c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
344d0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
344e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
344f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
34500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34510 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
34520 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
34530 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
34540 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
34550 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
34560 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
34570 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
34580 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
34590 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
345a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
345b0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
345c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
345d0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
345e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
345f0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
34600 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34610 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34620 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
34630 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
34640 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
34650 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34660 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
34670 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
34680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
34690 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
346a0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
346b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
346c0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
346d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
346e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
346f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
34700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
34710 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
34720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
34730 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
34740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34750 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
34760 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
34770 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
34780 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
34790 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
347a0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
347b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
347c0 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
347d0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
347e0 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
347f0 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
34800 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
34810 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
34820 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
34830 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
34840 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
34850 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
34860 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
34870 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
34880 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
34890 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
348a0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
348b0 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LE ){.          
348c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
348d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
348e0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
348f0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
34900 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4]);.           
34910 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65     if( iPage<=ne
34920 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
34930 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
34940 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
34950 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34990 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
349a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
349b0 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  t = sqlite3AbsIn
349c0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
349d0 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
349e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
349f0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
34a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
34a10 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
34a20 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
34a30 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
34a40 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
34a50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
34a60 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
34a70 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
34a80 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
34a90 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
34aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
34ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
34ac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ae0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
34af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
34b00 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
34b10 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
34b20 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
34b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
34b40 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
34b50 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
34b60 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
34b70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34b80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34b90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
34ba0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
34bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
34bd0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
34be0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
34bf0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
34c00 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
34c10 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
34c20 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
34c30 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
34c40 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
34c50 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
34c60 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
34c70 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
34c80 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
34c90 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
34ca0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
34cb0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
34cc0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
34cd0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
34ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34cf0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
34d00 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
34d10 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
34d20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34d30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34d40 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
34d50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
34d60 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
34d70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
34d80 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
34d90 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
34da0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
34db0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
34dc0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
34dd0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
34de0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
34df0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
34e00 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
34e10 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
34e20 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
34e30 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
34e40 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34e50 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
34e60 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34e70 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
34e80 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
34e90 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
34ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
34ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34ed0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
34ee0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
34ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
34f00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
34f20 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
34f30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
34f40 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
34f50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
34f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34f70 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
34f80 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
34f90 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
34fa0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
34fb0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
34fc0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
34fd0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
34fe0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
34ff0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
35000 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
35010 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
35020 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
35030 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
35040 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
35050 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
35060 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
35070 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
35080 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
35090 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
350a0 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
350b0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
350c0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
350d0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
350e0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
350f0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
35100 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
35110 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
35120 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
35130 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
35140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
35150 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
35160 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
35170 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
35180 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
35190 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
351a0 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
351b0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
351c0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
351d0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
351e0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
351f0 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
35200 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
35210 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
35220 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
35230 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
35240 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
35250 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
35260 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
35270 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
35280 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
35290 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
352a0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
352b0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
352c0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
352d0 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
352e0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
352f0 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
35300 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
35310 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35320 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
35330 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
35340 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
35350 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
35360 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
35370 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
35380 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
35390 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
353a0 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
353b0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
353c0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
353d0 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
353e0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
353f0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
35400 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
35410 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
35420 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
35430 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
35440 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
35450 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
35460 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
35470 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
35480 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
35490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
354a0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
354b0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
354c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
354d0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
354e0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
354f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35500 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
35510 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35520 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
35530 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
35540 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
35550 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
35560 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
35570 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
35580 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
35590 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
355a0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
355b0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
355c0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
355d0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
355e0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
355f0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
35600 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
35610 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
35620 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35630 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
35640 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
35650 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
35660 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
35670 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
35680 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
35690 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
356a0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
356b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
356c0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
356d0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
356e0 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
356f0 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
35700 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
35710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
35730 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35740 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
35750 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
35760 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
35770 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
35780 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
35790 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
357a0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
357b0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
357c0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
357d0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
357e0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
357f0 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
35800 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
35810 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
35820 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
35830 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
35840 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
35850 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
35860 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
35870 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
35880 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
35890 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
358a0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
358b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
358c0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
358d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
358e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
358f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
35900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35910 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
35920 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
35930 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
35940 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
35950 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
35960 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
35970 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
35980 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
35990 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
359a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
359b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
359c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
359d0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
359e0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
359f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
35a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
35a10 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
35a20 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
35a30 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
35a40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
35a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
35a60 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
35a70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
35a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
35a90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
35aa0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
35ab0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
35ac0 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
35ad0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
35ae0 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
35af0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
35b00 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
35b10 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
35b20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
35b30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
35b40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
35b50 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
35b60 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
35b70 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
35b80 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
35b90 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
35ba0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
35bb0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
35bc0 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
35bd0 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
35be0 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
35bf0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
35c00 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
35c10 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
35c20 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
35c30 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
35c40 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
35c50 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
35c60 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
35c70 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
35c80 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
35c90 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
35ca0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
35cb0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
35cc0 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
35cd0 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
35ce0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
35cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d00 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
35d10 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
35d20 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
35d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d40 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
35d50 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
35d60 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
35d70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
35d80 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
35d90 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
35da0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
35db0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
35dc0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
35dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35de0 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
35df0 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
35e00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
35e30 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
35e40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
35e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35e60 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
35e70 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
35e80 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
35e90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35ea0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
35eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
35ec0 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
35ed0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
35ee0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
35ef0 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
35f00 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
35f10 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
35f20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35f30 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
35f40 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
35f50 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
35f60 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
35f70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
35f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
35f90 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
35fa0 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
35fb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
35fc0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
35fd0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
35fe0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
35ff0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36000 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
36010 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
36020 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
36030 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
36040 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
36050 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
36060 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
36070 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
36080 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
36090 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
360a0 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
360b0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
360c0 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
360d0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
360e0 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
360f0 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
36100 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
36110 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
36120 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
36130 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
36140 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
36150 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
36160 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
36170 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
36180 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
36190 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
361a0 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
361b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
361c0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
361d0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
361e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
361f0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
36200 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
36210 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
36220 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
36230 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
36240 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
36250 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
36260 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
36270 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
36280 20 20 2a 2f 0a 20 20 69 66 28 20 52 45 51 55 49    */.  if( REQUI
36290 52 45 5f 50 54 52 4d 41 50 20 29 7b 0a 20 20 20  RE_PTRMAP ){.   
362a0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
362b0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
362c0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
362d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
362e0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
362f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
36300 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
36310 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
36320 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
36330 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
36340 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
36350 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
36360 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
36370 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
36380 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
36390 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
363a0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
363b0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
363c0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
363d0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
363e0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
363f0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
36400 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
36410 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
36420 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
36430 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
36440 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
36450 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
36460 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
36470 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
36480 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
36490 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
364a0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
364b0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
364c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
364d0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
364e0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
364f0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
36500 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
36510 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
36520 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
36530 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
36540 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
36550 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
36560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36570 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
36580 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
36590 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
365a0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
365b0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
365c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
365d0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
365e0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
365f0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
36600 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
36610 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
36620 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36630 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
36640 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
36650 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
36660 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
36670 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
36680 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
36690 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
366a0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
366b0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
366c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
366d0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
366e0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
366f0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
36700 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
36710 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
36720 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
36730 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
36740 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
36750 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
36760 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
36770 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
36780 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
36790 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
367a0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
367b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
367c0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
367d0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
367e0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
367f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
36800 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
36810 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
36820 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
36830 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
36840 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
36850 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
36860 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
36870 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
36880 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
36890 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
368a0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
368b0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
368c0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
368d0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
368e0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
368f0 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
36900 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
36910 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
36920 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
36930 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
36940 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
36950 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
36960 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
36970 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
36980 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
36990 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
369a0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
369b0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
369c0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
369d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
369e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
369f0 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
36a00 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
36a10 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
36a20 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
36a30 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
36a40 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
36a50 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
36a60 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
36a70 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
36a80 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
36a90 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
36aa0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
36ab0 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
36ac0 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
36ad0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
36ae0 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
36af0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
36b00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36b10 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
36b20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
36b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36b40 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
36b50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
36b60 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
36b70 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
36b80 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
36b90 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
36ba0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
36bb0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
36bc0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
36bd0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
36be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
36bf0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
36c00 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36c20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
36c30 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
36c40 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
36c50 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
36c60 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
36c70 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
36c80 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
36c90 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
36ca0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
36cb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
36cc0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
36cd0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
36ce0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
36cf0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
36d00 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
36d10 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
36d20 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
36d30 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
36d40 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
36d50 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
36d60 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
36d70 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
36d80 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
36d90 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
36da0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
36db0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
36dc0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
36dd0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
36de0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
36df0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
36e00 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
36e10 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
36e20 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
36e30 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
36e40 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
36e50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
36e60 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
36e70 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
36e80 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
36e90 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
36ea0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
36eb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
36ec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36ed0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
36ee0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
36ef0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
36f00 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
36f10 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
36f20 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
36f30 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
36f40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
36f50 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
36f60 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
36f70 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
36f80 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
36f90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
36fa0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
36fb0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
36fc0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
36fd0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
36fe0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
36ff0 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
37000 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
37010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
37020 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
37030 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
37040 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
37050 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
37060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
37070 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
37080 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
37090 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
370a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
370b0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
370c0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
370d0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
370e0 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
370f0 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
37100 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
37110 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
37120 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
37130 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
37140 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
37150 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
37160 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
37170 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
37180 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
37190 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
371a0 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
371b0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
371c0 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
371d0 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
371e0 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
371f0 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo          /* 
37200 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Size information
37210 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
37220 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
37230 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
37240 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  Bt;.  Pgno ovflP
37250 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
37260 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
37270 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
37280 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37290 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
372a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
372b0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
372c0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
372d0 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
372e0 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  if( pInfo->nLoca
372f0 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  l==pInfo->nPaylo
37300 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
37310 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
37320 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
37330 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
37340 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
37350 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
37360 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  ell+pInfo->nSize
37370 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  -1 > pPage->aDat
37380 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
37390 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
373a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
373b0 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  KPT;  /* Cell ex
373c0 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
373d0 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
373e0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
373f0 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66  yte(pCell + pInf
37400 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20  o->nSize - 4);. 
37410 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
37420 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
37430 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
37440 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
37450 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
37460 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
37470 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   - pInfo->nLocal
37480 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
37490 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
374a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
374b0 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
374c0 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e  RRUPT_DB && (pIn
374d0 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f  fo->nPayload + o
374e0 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66  vflPageSize)<ovf
374f0 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a  lPageSize).  );.
37500 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
37510 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
37520 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
37530 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
37540 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
37550 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
37560 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
37570 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
37580 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
37590 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
375a0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
375b0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
375c0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
375d0 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
375e0 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
375f0 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
37600 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
37610 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
37620 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
37630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37640 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
37650 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
37660 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
37670 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
37680 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
37690 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
376a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
376b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
376c0 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
376d0 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
376e0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
376f0 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
37700 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
37710 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
37720 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
37730 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
37740 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
37750 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
37760 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
37770 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
37780 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
37790 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
377a0 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
377b0 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
377c0 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
377d0 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
377e0 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
377f0 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
37800 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
37810 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
37820 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
37830 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
37840 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
37850 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
37860 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
37870 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
37880 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
37890 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
378a0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
378b0 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
378c0 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
378d0 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
378e0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
378f0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
37900 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
37910 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
37920 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
37930 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
37940 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
37950 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
37960 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
37970 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
37980 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
37990 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
379a0 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
379b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
379c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
379d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
379e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
379f0 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
37a00 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
37a10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
37a20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
37a30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37a40 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
37a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
37a60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
37a70 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
37a80 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
37a90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37aa0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
37ab0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
37ac0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
37ad0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
37ae0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
37af0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
37b00 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
37b10 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
37b20 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
37b30 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
37b40 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
37b50 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
37b60 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
37b70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
37b80 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
37b90 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
37ba0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
37bb0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
37bc0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
37bd0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
37be0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
37bf0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
37c00 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
37c10 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
37c20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
37c30 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
37c40 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
37c50 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
37c60 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
37c70 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
37c80 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
37c90 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
37ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
37cb0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
37cc0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37ce0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
37cf0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
37d00 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
37d10 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
37d20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
37d30 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
37d40 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65  */.  const Btree
37d50 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20  Payload *pX,    
37d60 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77      /* Payload w
37d70 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e  ith which to con
37d80 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20  struct the cell 
37d90 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
37da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37db0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
37dc0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
37dd0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
37de0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
37df0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
37e00 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
37e10 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
37e20 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
37e30 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
37e40 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
37e50 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
37e60 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
37e70 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
37e80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37e90 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
37ea0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
37eb0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
37ec0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37ed0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
37ee0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
37ef0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
37f00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
37f10 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
37f20 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
37f30 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
37f40 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
37f50 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
37f60 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
37f70 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
37f80 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
37f90 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
37fa0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
37fb0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
37fd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37fe0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
37ff0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
38000 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
38010 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
38020 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
38030 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50  trSize;.  if( pP
38040 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
38050 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58     nPayload = pX
38060 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a  ->nData + pX->nZ
38070 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  ero;.    pSrc = 
38080 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e  pX->pData;.    n
38090 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b  Src = pX->nData;
380a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
380b0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
380c0 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  ; /* fillInCell(
380d0 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  ) only called fo
380e0 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20  r leaves */.    
380f0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
38100 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
38110 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
38120 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  );.    nHeader +
38130 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
38140 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
38150 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a  64*)&pX->nKey);.
38160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
38170 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30  ert( pX->nKey<=0
38180 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58 2d  x7fffffff && pX-
38190 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20  >pKey!=0 );.    
381a0 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20  nSrc = nPayload 
381b0 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b  = (int)pX->nKey;
381c0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
381d0 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65  pKey;.    nHeade
381e0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
381f0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
38200 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d  , nPayload);.  }
38210 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
38220 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
38230 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
38240 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
38250 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  ){.    n = nHead
38260 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
38270 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
38280 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
38290 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
382a0 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
382b0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
382c0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
382d0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
382e0 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20  Prior = pCell;. 
382f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
38300 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  mn = pPage->minL
38310 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e  ocal;.    n = mn
38320 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
38330 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  n) % (pPage->pBt
38340 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
38350 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
38360 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
38370 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
38380 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
38390 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
383a0 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e   if( n > pPage->
383b0 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d  maxLocal ) n = m
383c0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
383d0 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = n;.    *pnSiz
383e0 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20  e = n + nHeader 
383f0 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  + 4;.    pPrior 
38400 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
38410 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c  +n];.  }.  pPayl
38420 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
38430 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20  ader];..  /* At 
38440 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61  this point varia
38450 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  bles should be s
38460 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  et as follows:. 
38470 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c   **.  **   nPayl
38480 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f  oad           To
38490 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65