/ Hex Artifact Content
Login

Artifact 59695c6e5eb527bfefc2b3d8ffebd178ad8686eaeb810c9f57719d6d2b72822e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
be40: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
be50: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
be60: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
be70: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
be80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
be90: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
bea0: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
beb0: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
bec0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
bed0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
bee0: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
bef0: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
bf00: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
bf10: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
bf20: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
bf30: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
bf40: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
bf50: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
bf60: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
bf70: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
bf80: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
bf90: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
bfa0: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
bfb0: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
bfc0: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
bfd0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
bfe0: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
bff0: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
c000: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
c010: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 0a 20  data[hdr+1]);.. 
c020: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 69     /* If the ini
c030: 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b 20 6f  tial freeblock o
c040: 66 66 73 65 74 20 77 65 72 65 20 6f 75 74 20 6f  ffset were out o
c050: 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74 20 77  f bounds, that w
c060: 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 2a 2a  ould have.    **
c070: 20 62 65 65 6e 20 64 65 74 65 63 74 65 64 20 62   been detected b
c080: 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  y btreeComputeFr
c090: 65 65 53 70 61 63 65 28 29 20 77 68 65 6e 20 69  eeSpace() when i
c0a0: 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e 67 20  t was computing 
c0b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
c0c0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c0d0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
c0e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
c0f0: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e<=usableSize-4 
c100: 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  );.    if( iFree
c110: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46   ){.      int iF
c120: 72 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28  ree2 = get2byte(
c130: 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 20  &data[iFree]);. 
c140: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 3e       if( iFree2>
c150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 72  usableSize-4 ) r
c160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c170: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c180: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69  ;.      if( 0==i
c190: 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69  Free2 || (data[i
c1a0: 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74  Free2]==0 && dat
c1b0: 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20  a[iFree2+1]==0) 
c1c0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
c1d0: 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  End = &data[cell
c1e0: 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
c1f0: 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ];.        u8 *p
c200: 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Addr;.        in
c210: 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20  t sz2 = 0;.     
c220: 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32     int sz = get2
c230: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c240: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  +2]);.        in
c250: 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65  t top = get2byte
c260: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c270: 20 20 20 20 20 20 20 20 69 66 28 20 74 6f 70 3e          if( top>
c280: 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  =iFree ){.      
c290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2a0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
c2b0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
c2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
c2d0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
c2e0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
c2f0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
c300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c310: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c320: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
c330: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
c340: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2]);.          i
c350: 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20 3e 20  f( iFree2+sz2 > 
c360: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
c370: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c380: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c390: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
c3a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
c3b0: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
c3c0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
c3d0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
c3e0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
c3f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c400: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
c410: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c420: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
c430: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
c440: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
c450: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
c460: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
c470: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
c480: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
c490: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
c4a0: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
c4b0: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
c4c0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
c4d0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
c4e0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
c4f0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
c500: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
c510: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
c520: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
c530: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
c540: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
c550: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
c560: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
c570: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
c580: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
c590: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
c5a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
c5b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
c5c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
c5d0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
c5e0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
c5f0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
c600: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
c610: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
c620: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c630: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
c640: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
c650: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
c660: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
c670: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
c680: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
c690: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
c6a0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
c6b0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
c6c0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
c6d0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
c6e0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
c6f0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c700: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c710: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c720: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c730: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c740: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
c750: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
c760: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
c770: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
c780: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
c790: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
c7a0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
c7b0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
c7c0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
c7d0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c7e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c7f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c800: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
c810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
c820: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
c830: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c  ze && cbrk>=iCel
c840: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
c850: 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a  stcase( cbrk+siz
c860: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
c870: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c880: 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  c+size==usableSi
c890: 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ze );.    put2by
c8a0: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
c8b0: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30  .    if( temp==0
c8c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b   ){.      int x;
c8d0: 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d  .      if( cbrk=
c8e0: 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =pc ) continue;.
c8f0: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c        temp = sql
c900: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
c910: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
c920: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20  Pager);.      x 
c930: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c940: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c950: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c  memcpy(&temp[x],
c960: 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b   &data[x], (cbrk
c970: 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20  +size) - x);.   
c980: 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20     src = temp;. 
c990: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
c9a0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72  &data[cbrk], &sr
c9b0: 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  c[pc], size);.  
c9c0: 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  }.  data[hdr+7] 
c9d0: 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e  = 0;.. defragmen
c9e0: 74 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72 74 28  t_out:.  assert(
c9f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30   pPage->nFree>=0
ca00: 20 29 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 68   );.  if( data[h
ca10: 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c  dr+7]+cbrk-iCell
ca20: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
ca30: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
ca40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ca50: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ca60: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
ca70: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
ca80: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ca90: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
caa0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
cab0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
cac0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
cad0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
cae0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
caf0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
cb00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
cb10: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
cb20: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
cb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
cb50: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
cb60: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
cb70: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
cb80: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
cb90: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
cba0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
cbb0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
cbc0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
cbd0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
cbe0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
cbf0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
cc00: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
cc10: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
cc20: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
cc30: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
cc40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
cc50: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
cc60: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
cc70: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
cc80: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
cc90: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
cca0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
ccb0: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
ccc0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
ccd0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
cce0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
ccf0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
cd00: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
cd10: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
cd20: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
cd30: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
cd40: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
cd50: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
cd60: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
cd70: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
cd80: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
cd90: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
cda0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
cdb0: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
cdc0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
cdd0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
cde0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
cdf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ce00: 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
ce10: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  er */.  u8 * con
ce20: 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
ce30: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
ce40: 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20     /* Page data 
ce50: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d  */.  int iAddr =
ce60: 20 68 64 72 20 2b 20 31 3b 20 20 20 20 20 20 20   hdr + 1;       
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
ce90: 72 20 74 6f 20 70 63 20 2a 2f 0a 20 20 69 6e 74  r to pc */.  int
cea0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
ceb0: 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 20 20  aData[iAddr]);  
cec0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ced0: 73 73 20 6f 66 20 61 20 66 72 65 65 20 73 6c 6f  ss of a free slo
cee0: 74 20 2a 2f 0a 20 20 69 6e 74 20 78 3b 20 20 20  t */.  int x;   
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 2f 2a 20 45 78 63 65 73 73 20 73 69 7a 65    /* Excess size
cf20: 20 6f 66 20 74 68 65 20 73 6c 6f 74 20 2a 2f 0a   of the slot */.
cf30: 20 20 69 6e 74 20 6d 61 78 50 43 20 3d 20 70 50    int maxPC = pP
cf40: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
cf50: 7a 65 20 2d 20 6e 42 79 74 65 3b 20 20 2f 2a 20  ze - nByte;  /* 
cf60: 4d 61 78 20 61 64 64 72 65 73 73 20 66 6f 72 20  Max address for 
cf70: 61 20 75 73 61 62 6c 65 20 73 6c 6f 74 20 2a 2f  a usable slot */
cf80: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cfb0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
cfc0: 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73  e slot */..  ass
cfd0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77  ert( pc>0 );.  w
cfe0: 68 69 6c 65 28 20 70 63 3c 3d 6d 61 78 50 43 20  hile( pc<=maxPC 
cff0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
d000: 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35  CE-OF: R-22710-5
d010: 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61  3328 The third a
d020: 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20  nd fourth bytes 
d030: 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66  of each.    ** f
d040: 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20  reeblock form a 
d050: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
d060: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
d070: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  size of the free
d080: 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20  block.    ** in 
d090: 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67  bytes, including
d0a0: 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64   the 4-byte head
d0b0: 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20  er. */.    size 
d0c0: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
d0d0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66  a[pc+2]);.    if
d0e0: 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  ( (x = size - nB
d0f0: 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  yte)>=0 ){.     
d100: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
d110: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
d120: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
d130: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
d140: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d150: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
d160: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
d170: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
d180: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
d190: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
d1a0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
d1b0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
d1c0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
d1d0: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
d1e0: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
d1f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
d200: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
d210: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
d220: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
d230: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
d240: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
d250: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
d260: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
d270: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
d280: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
d290: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
d2a0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
d2b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d2c0: 28 20 78 2b 70 63 20 3e 20 6d 61 78 50 43 20 29  ( x+pc > maxPC )
d2d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
d2e0: 73 20 73 6c 6f 74 20 65 78 74 65 6e 64 73 20 6f  s slot extends o
d2f0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
d300: 65 20 75 73 61 62 6c 65 20 70 61 72 74 20 6f 66  e usable part of
d310: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d320: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
d330: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
d340: 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
d350: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
d360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
d370: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
d380: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
d390: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
d3a0: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
d3b0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
d3c0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
d3d0: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
d3e0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
d3f0: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
d400: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
d410: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d420: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
d430: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
d440: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
d450: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d460: 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  c]);.    if( pc<
d470: 69 41 64 64 72 2b 73 69 7a 65 20 29 7b 0a 20 20  iAddr+size ){.  
d480: 20 20 20 20 69 66 28 20 70 63 20 29 7b 0a 20 20      if( pc ){.  
d490: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
d4a0: 74 20 73 6c 6f 74 20 69 6e 20 74 68 65 20 63 68  t slot in the ch
d4b0: 61 69 6e 20 69 73 20 6e 6f 74 20 70 61 73 74 20  ain is not past 
d4c0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
d4d0: 75 72 72 65 6e 74 20 73 6c 6f 74 20 2a 2f 0a 20  urrent slot */. 
d4e0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
d4f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
d500: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  E(pPg);.      }.
d510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
d520: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d530: 70 63 3e 6d 61 78 50 43 2b 6e 42 79 74 65 2d 34  pc>maxPC+nByte-4
d540: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
d550: 72 65 65 20 73 6c 6f 74 20 63 68 61 69 6e 20 65  ree slot chain e
d560: 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65  xtends off the e
d570: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
d580: 2f 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c  /.    *pRc = SQL
d590: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
d5a0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
d5b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d5c0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
d5d0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
d5e0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
d5f0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
d600: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
d610: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
d620: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
d630: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
d640: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
d650: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
d660: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
d670: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
d680: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
d690: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
d6a0: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
d6b0: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
d6c0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
d6d0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
d6e0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
d6f0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
d700: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
d710: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d720: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
d730: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
d740: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
d750: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
d760: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
d770: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d780: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
d790: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
d7a0: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
d7b0: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
d7c0: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
d7d0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
d7e0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
d7f0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
d800: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
d810: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
d820: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
d830: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
d840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d850: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
d860: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d870: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
d880: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
d890: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
d8a0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
d8b0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d8c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d8d0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
d8e0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d8f0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
d900: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d910: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
d920: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d950: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
d960: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
d970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
d9a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
d9b0: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
d9c0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
d9d0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
d9e0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
d9f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
da00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
da10: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
da20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
da30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
da40: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
da50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
da60: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
da70: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
da80: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
da90: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
daa0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
dab0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
dac0: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
dad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
dae0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
daf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
db00: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
db10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
db20: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
db30: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
db40: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
db50: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
db60: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
db70: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
db80: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
db90: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
dba0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
dbb0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
dbc0: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
dbd0: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
dbe0: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
dbf0: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
dc00: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
dc10: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
dc20: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
dc30: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
dc40: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
dc60: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
dc70: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
dc80: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
dc90: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
dca0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
dcb0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
dcc0: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
dcd0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
dce0: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
dcf0: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
dd00: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
dd10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
dd20: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
dd30: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
dd40: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
dd50: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
dd60: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
dd70: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
dd80: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
dd90: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
dda0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
ddb0: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
ddc0: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
ddd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ddf0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
de00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
de10: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
de20: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
de30: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
de40: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
de50: 70 6f 69 6e 74 65 72 2c 0a 20 20 2a 2a 20 61 6e  pointer,.  ** an
de60: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
de70: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
de80: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
de90: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
dea0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74  oking for a slot
deb0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
dec0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
ded0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
dee0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
def0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
df00: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
df10: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
df20: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
df30: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
df40: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
df50: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
df60: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
df70: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
df80: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
df90: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
dfa0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
dfb0: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
dfc0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
dfd0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
dfe0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
dff0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
e000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e010: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
e020: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
e030: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
e040: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
e050: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
e060: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
e070: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
e080: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
e090: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
e0a0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
e0b0: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
e0c0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
e0d0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
e0e0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
e0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e100: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
e110: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
e120: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e130: 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 20 20  nFree>=0 );.    
e140: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
e150: 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34  age(pPage, MIN(4
e160: 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d  , pPage->nFree -
e170: 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20   (2+nByte)));.  
e180: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
e190: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
e1a0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
e1b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
e1c0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32     assert( gap+2
e1d0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
e1e0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
e1f0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
e200: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
e210: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
e220: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
e230: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
e240: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
e250: 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65 53 70  reeComputeFreeSp
e260: 61 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  ace() call has a
e270: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
e280: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
e290: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
e2a0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
e2b0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
e2c0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
e2d0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
e2e0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
e2f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
e300: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
e310: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
e320: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
e330: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
e340: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
e350: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
e360: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
e370: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
e380: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
e390: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e3a0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
e3b0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
e3c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e3d0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
e3e0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
e3f0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
e400: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
e410: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
e420: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
e430: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
e440: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
e450: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
e460: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
e470: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
e480: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
e490: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
e4a0: 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20  .** Even though 
e4b0: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
e4c0: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
e4d0: 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  y btreeComputeFr
e4e0: 65 65 53 70 61 63 65 28 29 2c 0a 2a 2a 20 74 68  eeSpace(),.** th
e4f0: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
e500: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
e510: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
e520: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
e530: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
e540: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
e550: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
e560: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
e570: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
e580: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
e590: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
e5a0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
e5b0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
e5c0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
e5d0: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
e5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e5f0: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
e600: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
e610: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
e620: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
e630: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
e640: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
e650: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e680: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
e690: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
e6a0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
e6d0: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
e6e0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e710: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
e720: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
e730: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
e760: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
e770: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
e780: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
e790: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e7a0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
e7b0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
e7c0: 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20 20    u16 x;        
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
e7f0: 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
e800: 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20  t area */.  u32 
e810: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
e820: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
e830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
e840: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
e850: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
e860: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
e870: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
e880: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
e890: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
e8a0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e8b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e8c0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
e8d0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
e8e0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e8f0: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
e900: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
e910: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
e920: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
e930: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
e940: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
e950: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
e960: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
e970: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e980: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e990: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
e9a0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
e9b0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
e9c0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
e9d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
e9e0: 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt<=pPage->pBt->
e9f0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
ea00: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
ea10: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
ea20: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
ea30: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
ea40: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
ea50: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
ea60: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
ea70: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
ea80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ea90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
eaa0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
eab0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
eac0: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
ead0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
eae0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
eaf0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
eb00: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
eb10: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
eb20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
eb30: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
eb40: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
eb50: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
eb60: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
eb70: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
eb80: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
eb90: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
eba0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ebb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ebc0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
ebd0: 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  }.      iPtr = i
ebe0: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
ebf0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
ec00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
ec10: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
ec20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ec30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
ec40: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
ec50: 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e  ssert( iFreeBlk>
ec60: 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b  iPtr || iFreeBlk
ec70: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ==0 );.  .    /*
ec80: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a   At this point:.
ec90: 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42      **    iFreeB
eca0: 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65  lk:   First free
ecb0: 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61  block after iSta
ecc0: 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e  rt, or zero if n
ecd0: 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50  one.    **    iP
ece0: 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64  tr:       The ad
ecf0: 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74  dress of a point
ed00: 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20  er to iFreeBlk. 
ed10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
ed20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72  ck to see if iFr
ed30: 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20  eeBlk should be 
ed40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
ed50: 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74  he end of iStart
ed60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ed70: 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e   iFreeBlk && iEn
ed80: 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b  d+3>=iFreeBlk ){
ed90: 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69  .      nFrag = i
eda0: 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a  FreeBlk - iEnd;.
edb0: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69        if( iEnd>i
edc0: 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e  FreeBlk ) return
edd0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ede0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
edf0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
ee00: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
ee10: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
ee20: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
ee30: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
ee40: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
ee50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ee60: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ee70: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
ee80: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
ee90: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
eea0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
eeb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
eec0: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
eed0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
eee0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
eef0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
ef00: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
ef10: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
ef20: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
ef30: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
ef40: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
ef50: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
ef60: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
ef70: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
ef80: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
ef90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
efa0: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
efb0: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
efc0: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
efd0: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
efe0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
eff0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
f000: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
f010: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
f020: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
f030: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
f040: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
f050: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
f060: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
f070: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
f080: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
f090: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
f0a0: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
f0b0: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
f0c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f0d0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
f0e0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
f0f0: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
f100: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
f110: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
f120: 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a 20  ( iStart<=x ){. 
f130: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
f140: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
f150: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
f160: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f170: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
f180: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
f190: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f1a0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
f1b0: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
f1c0: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
f1d0: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 53  ry */.    if( iS
f1e0: 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21 3d  tart<x || iPtr!=
f1f0: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
f200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f210: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70  GE(pPage);.    p
f220: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
f230: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
f240: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
f250: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
f260: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f270: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
f280: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
f290: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
f2a0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
f2b0: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
f2c0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  t);.  }.  if( pP
f2d0: 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  age->pBt->btsFla
f2e0: 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
f2f0: 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  CURE ){.    /* O
f300: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
f310: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
f320: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
f330: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
f340: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20     ** option is 
f350: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  enabled */.    m
f360: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61  emset(&data[iSta
f370: 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a  rt], 0, iSize);.
f380: 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
f390: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
f3a0: 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32 62  reeBlk);.  put2b
f3b0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
f3c0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 70  +2], iSize);.  p
f3d0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69  Page->nFree += i
f3e0: 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75  OrigSize;.  retu
f3f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f400: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
f410: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
f420: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
f430: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
f440: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
f450: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
f460: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
f470: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
f480: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
f490: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
f4a0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
f4b0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
f4c0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
f4d0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
f4e0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
f4f0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
f500: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
f510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
f520: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
f530: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
f540: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f550: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
f560: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
f570: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
f580: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
f590: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
f5a0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
f5b0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
f5c0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f5d0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
f5e0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
f5f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
f600: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
f610: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
f620: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
f630: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f640: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f650: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f660: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
f670: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
f680: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
f690: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
f6a0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
f6b0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
f6c0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
f6d0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
f6e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  ;.  pPage->xCell
f6f0: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
f700: 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  tr;.  pBt = pPag
f710: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
f720: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
f730: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
f740: 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  EY) ){.    /* EV
f750: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32  IDENCE-OF: R-072
f760: 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65  91-35328 A value
f770: 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65 61   of 5 (0x05) mea
f780: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f790: 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f  n.    ** interio
f7a0: 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  r table b-tree p
f7b0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f7c0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
f7d0: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
f7e0: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
f7f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d  NCE-OF: R-26900-
f800: 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66  09176 A value of
f810: 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73   13 (0x0d) means
f820: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
f830: 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65     ** leaf table
f840: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
f850: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
f860: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
f870: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
f880: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
f890: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
f8a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
f8b0: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
f8c0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
f8d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f8e0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
f8f0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20  eParseCellPtr;. 
f900: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f910: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f920: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
f930: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
f940: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
f950: 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67  load;.      pPag
f960: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
f970: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
f980: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
f990: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  }.    pPage->max
f9a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
f9b0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
f9c0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
f9d0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
f9e0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
f9f0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
fa00: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
fa10: 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30  OF: R-43316-3730
fa20: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28  8 A value of 2 (
fa30: 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20  0x02) means the 
fa40: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
fa50: 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78  * interior index
fa60: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
fa70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
fa80: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
fa90: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
faa0: 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32  E-OF: R-59615-42
fab0: 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31  828 A value of 1
fac0: 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74  0 (0x0a) means t
fad0: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
fae0: 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62   ** leaf index b
faf0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
fb00: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
fb10: 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41  ZERODATA|PTF_LEA
fb20: 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50  F)==10 );.    pP
fb30: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
fb40: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
fb50: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
fb60: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
fb70: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
fb80: 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20  llPtrIndex;.    
fb90: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
fba0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
fbb0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
fbc0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
fbd0: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
fbe0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
fbf0: 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39  F: R-47608-56469
fc00: 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   Any other value
fc10: 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20   for the b-tree 
fc20: 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20  page type is.   
fc30: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   ** an error. */
fc40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc50: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
fc60: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50  pPage);.  }.  pP
fc70: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
fc80: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
fc90: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
fca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
fcc0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
fcd0: 66 72 65 65 73 70 61 63 65 20 6f 6e 20 74 68 65  freespace on the
fce0: 20 70 61 67 65 2e 20 20 49 6e 20 6f 74 68 65 72   page.  In other
fcf0: 20 77 6f 72 64 73 2c 20 66 69 6c 6c 0a 2a 2a 20   words, fill.** 
fd00: 69 6e 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46  in the pPage->nF
fd10: 72 65 65 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  ree field..*/.st
fd20: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f  atic int btreeCo
fd30: 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28 4d  mputeFreeSpace(M
fd40: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
fd50: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
fd60: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fd70: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
fd80: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
fd90: 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72  ta[] */.  u8 hdr
fda0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fdb0: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
fdc0: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
fdd0: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
fde0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
fdf0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
fe00: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ata */.  int usa
fe10: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
fe20: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
fe30: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
fe40: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  ge */.  int nFre
fe50: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
fe60: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
fe70: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
fe80: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
fe90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fea0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
feb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
fec0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
fed0: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fee0: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fef0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
ff00: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
ff10: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
ff20: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
ff30: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ff40: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
ff50: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
ff60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
ff70: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
ff80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ff90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ffa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ffb0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
ffc0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
ffd0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
ffe0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fff0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
10000 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
10010 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10020 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10040 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
10050 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10060 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10080 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 31 20 29  age->isInit==1 )
10090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
100a0 65 2d 3e 6e 46 72 65 65 3c 30 20 29 3b 0a 0a 20  e->nFree<0 );.. 
100b0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
100c0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
100d0 53 69 7a 65 3b 0a 20 20 68 64 72 20 3d 20 70 50  Size;.  hdr = pP
100e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
100f0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
10100 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44  aData;.  /* EVID
10110 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35  ENCE-OF: R-58015
10120 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62  -48175 The two-b
10130 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
10140 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74  ffset 5 designat
10150 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72  es.  ** the star
10160 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
10170 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
10180 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
10190 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 2a  s integer is.  *
101a0 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  * interpreted as
101b0 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70   65536. */.  top
101c0 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
101d0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
101e0 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
101f0 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
10200 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2b  ->childPtrSize +
10210 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
10220 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
10230 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 0a  sableSize - 4;..
10240 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10250 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
10260 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  e on the page.  
10270 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10280 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10290 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
102a0 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
102b0 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  ives the.  ** st
102c0 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
102d0 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
102e0 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
102f0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
10300 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  no.  ** freebloc
10310 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  ks. */.  pc = ge
10320 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
10330 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
10340 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
10350 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
10360 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10370 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10380 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20  .  if( pc>0 ){. 
10390 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73 69 7a     u32 next, siz
103a0 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  e;.    if( pc<iC
103b0 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
103c0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
103d0 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
103e0 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
103f0 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10400 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ere will.      *
10410 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
10420 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
10430 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
10440 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
10450 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10460 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10470 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20 20 20  AGE(pPage); .   
10480 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20   }.    while( 1 
10490 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  ){.      if( pc>
104a0 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
104b0 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
104c0 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
104d0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
104e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
104f0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10500 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
10510 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
10520 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
10530 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
10540 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10550 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  +2]);.      nFre
10560 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10570 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
10580 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
10590 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  eak;.      pc = 
105a0 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
105b0 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
105c0 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b      /* Freeblock
105d0 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
105e0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
105f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10600 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10610 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
10620 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67  ( pc+size>(unsig
10630 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69  ned int)usableSi
10640 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  ze ){.      /* L
10650 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78  ast freeblock ex
10660 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20  tends past page 
10670 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  end */.      ret
10680 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10690 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
106a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
106b0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
106c0 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
106d0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
106e0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
106f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c  .  ** of the cel
10700 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
10710 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
10720 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
10730 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c  hin.  ** the cel
10740 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
10750 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
10760 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
10770 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  le-size.  ** of 
10780 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
10790 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
107a0 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
107b0 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20  check also.  ** 
107c0 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
107d0 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
107e0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
107f0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10800 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63  t.  ** area, acc
10810 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10820 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10830 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
10850 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
10860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10870 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10880 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Page);.  }.  pPa
10890 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
108a0 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
108b0 69 72 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  irst);.  return 
108c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
108d0 0a 2a 2a 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  .** Do additiona
108e0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 61  l sanity check a
108f0 66 74 65 72 20 62 74 72 65 65 49 6e 69 74 50 61  fter btreeInitPa
10900 67 65 28 29 20 69 66 0a 2a 2a 20 50 52 41 47 4d  ge() if.** PRAGM
10910 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
10920 6b 3d 4f 4e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  k=ON .*/.static 
10930 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
10940 69 6e 74 20 62 74 72 65 65 43 65 6c 6c 53 69 7a  int btreeCellSiz
10950 65 43 68 65 63 6b 28 4d 65 6d 50 61 67 65 20 2a  eCheck(MemPage *
10960 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 43  pPage){.  int iC
10970 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
10980 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
10990 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
109a0 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  k offset */.  in
109b0 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
109c0 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
109d0 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
109e0 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
109f0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10a00 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
10a10 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
10a20 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
10a30 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
10a40 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
10a50 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  l */.  int pc;  
10a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10a70 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
10a80 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
10a90 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  ->aData[] */.  u
10aa0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
10ab0 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
10ac0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
10ad0 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
10ae0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 73     /* Maximum us
10af0 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68  able space on th
10b00 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
10b10 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
10b20 2a 20 53 74 61 72 74 20 6f 66 20 63 65 6c 6c 20  * Start of cell 
10b30 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
10b40 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
10b50 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
10b60 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
10b70 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
10b80 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
10b90 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
10ba0 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
10bb0 69 7a 65 20 2d 20 34 3b 0a 20 20 64 61 74 61 20  ize - 4;.  data 
10bc0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
10bd0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
10be0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
10bf0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
10c00 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
10c10 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  --;.  for(i=0; i
10c20 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
10c30 2b 2b 29 7b 0a 20 20 20 20 70 63 20 3d 20 67 65  ++){.    pc = ge
10c40 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10c50 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10c60 2a 32 5d 29 3b 0a 20 20 20 20 74 65 73 74 63 61  *2]);.    testca
10c70 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
10c80 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
10c90 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
10ca0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  t );.    if( pc<
10cb0 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
10cc0 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
10cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ce0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10cf0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10d00 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65   sz = pPage->xCe
10d10 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64  llSize(pPage, &d
10d20 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 74 65  ata[pc]);.    te
10d30 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
10d40 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
10d50 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10d60 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
10d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10d80 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10db0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
10dc0 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
10dd0 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
10de0 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
10df0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
10e00 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
10e10 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
10e20 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
10e30 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
10e40 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
10e50 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
10e60 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
10e70 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
10e80 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
10e90 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
10ea0 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
10eb0 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
10ec0 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
10ed0 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
10ee0 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
10ef0 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
10f00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
10f10 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
10f20 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
10f30 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 38 20 2a   *pPage){.  u8 *
10f40 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
10f50 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
10f60 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
10f70 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
10f80 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
10f90 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
10fa0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
10fb0 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
10fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
10fd0 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
10fe0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10ff0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11000 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
11020 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
11030 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
11040 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
11050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11060 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
11070 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
11080 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
110a0 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
110b0 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
110c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
110d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
110e0 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42  Init==0 );..  pB
110f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
11100 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
11110 61 44 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 68  aData + pPage->h
11120 64 72 4f 66 66 73 65 74 3b 0a 20 20 2f 2a 20 45  drOffset;.  /* E
11130 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
11140 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e  594-02890 The on
11150 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f  e-byte flag at o
11160 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69  ffset 0 indicati
11170 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72  ng.  ** the b-tr
11180 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f  ee page type. */
11190 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61  .  if( decodeFla
111a0 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 30  gs(pPage, data[0
111b0 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
111c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
111d0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
111e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
111f0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11200 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
11210 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
11220 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
11230 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
11240 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
11250 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
11260 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
11270 65 74 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  et = pPage->hdrO
11280 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 61 67  ffset + 8 + pPag
11290 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
112a0 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
112b0 64 78 20 3d 20 64 61 74 61 20 2b 20 70 50 61 67  dx = data + pPag
112c0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
112d0 2b 20 38 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  + 8;.  pPage->aD
112e0 61 74 61 45 6e 64 20 3d 20 70 50 61 67 65 2d 3e  ataEnd = pPage->
112f0 61 44 61 74 61 20 2b 20 70 42 74 2d 3e 75 73 61  aData + pBt->usa
11300 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  bleSize;.  pPage
11310 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 70 50  ->aDataOfst = pP
11320 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 50 61  age->aData + pPa
11330 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
11340 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
11350 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
11360 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
11370 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
11380 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a   3 gives the.  *
11390 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
113a0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
113b0 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  /.  pPage->nCell
113c0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
113d0 61 5b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  a[3]);.  if( pPa
113e0 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
113f0 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
11400 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
11410 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
11420 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
11430 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
11440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11450 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
11460 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age);.  }.  test
11470 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
11480 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
11490 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
114a0 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
114b0 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
114c0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
114d0 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
114e0 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
114f0 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
11500 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
11510 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
11520 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66  hen the.  ** off
11530 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
11540 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
11550 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
11560 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
11570 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
11580 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
11590 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
115a0 2d 3e 6e 43 65 6c 6c 3e 30 0a 20 20 20 20 20 20  ->nCell>0.      
115b0 20 7c 7c 20 67 65 74 32 62 79 74 65 4e 6f 74 5a   || get2byteNotZ
115c0 65 72 6f 28 26 64 61 74 61 5b 35 5d 29 3d 3d 70  ero(&data[5])==p
115d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 0a 20  Bt->usableSize. 
115e0 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
115f0 5f 44 42 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  _DB );.  pPage->
11600 6e 46 72 65 65 20 3d 20 2d 31 3b 20 20 2f 2a 20  nFree = -1;  /* 
11610 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  Indicate that th
11620 69 73 20 76 61 6c 75 65 20 69 73 20 79 65 74 20  is value is yet 
11630 75 6e 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 20 20  uncomputed */.  
11640 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
11650 31 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62  1;.  if( pBt->db
11660 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
11670 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20  _CellSizeCk ){. 
11680 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 43     return btreeC
11690 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 70 50 61  ellSizeCheck(pPa
116a0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
116b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
116c0 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
116d0 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
116e0 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
116f0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
11700 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
11710 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
11720 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
11730 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
11740 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
11750 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
11760 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
11770 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11780 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
11790 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
117a0 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
117b0 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
117c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
117d0 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
117e0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
117f0 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
11800 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11810 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11820 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11830 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
11840 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11850 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
11860 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
11870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11880 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
11890 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
118a0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
118b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
118c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
118d0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
118e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
118f0 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
11900 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
11910 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
11920 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
11930 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
11940 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
11950 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
11960 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
11970 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
11980 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
11990 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
119a0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
119b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
119c0 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
119d0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
119e0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
119f0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
11a00 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
11a10 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
11a20 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
11a30 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
11a40 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
11a50 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
11a60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
11a70 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
11a80 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
11a90 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
11aa0 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
11ab0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11ac0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
11ad0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
11ae0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
11af0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
11b00 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
11b10 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
11b20 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
11b30 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
11b40 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
11b50 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
11b60 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
11b70 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
11b80 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
11b90 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
11ba0 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
11bb0 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
11bc0 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
11bd0 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11be0 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11bf0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
11c00 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
11c10 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
11c20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
11c30 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
11c40 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11c50 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
11c60 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
11c70 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
11c80 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
11c90 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11ca0 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
11cb0 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
11cc0 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
11cd0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
11ce0 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
11cf0 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
11d00 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
11d10 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
11d20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11d30 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
11d40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11d50 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
11d60 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
11d70 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11d80 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
11d90 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11da0 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11db0 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11dc0 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11dd0 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
11de0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
11df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
11e00 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
11e10 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
11e20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
11e30 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
11e40 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
11e50 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
11e60 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
11e70 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11e80 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11e90 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11ea0 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11eb0 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11ec0 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
11ed0 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
11ee0 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
11ef0 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
11f00 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
11f10 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
11f20 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
11f30 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
11f40 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
11f50 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
11f60 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
11f70 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11f80 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11f90 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11fa0 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11fb0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11fc0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
11fd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11fe0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11ff0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
12000 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
12010 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
12020 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
12030 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
12050 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12060 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12070 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12080 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
12090 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
120a0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
120b0 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
120c0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
120d0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
120e0 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
120f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12100 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12110 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
12120 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
12130 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
12140 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
12150 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12160 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12170 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
12180 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
12190 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
121a0 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
121b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
121c0 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
121d0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
121e0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
121f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
12200 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
12210 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
12220 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
12230 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
12240 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
12250 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
12260 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
12270 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
12280 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
12290 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
122a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
122b0 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
122c0 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
122d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
122e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
122f0 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
12300 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
12310 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
12320 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
12330 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
12340 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
12350 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12360 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
12370 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12380 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12390 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
123a0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
123b0 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
123c0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
123d0 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
123e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
123f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
12400 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
12410 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
12420 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
12430 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
12440 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
12450 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
12460 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
12470 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
12480 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
12490 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
124a0 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  0000000)==0 );. 
124b0 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
124c0 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
124d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
124e0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
124f0 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
12500 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  e it..**.** If p
12510 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Cur!=0 then the 
12520 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65  page is being fe
12530 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  tched as part of
12540 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
12550 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64  .** call.  Do ad
12560 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
12570 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
12580 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
12590 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  e..** And if the
125a0 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68   fetch fails, th
125b0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
125c0 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e  decrement pCur->
125d0 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iPage..**.** The
125e0 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64   page is fetched
125f0 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75   as read-write u
12600 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f  nless pCur is no
12610 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a  t NULL and is.**
12620 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
12630 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  sor..**.** If an
12640 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
12650 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75  hen *ppPage is u
12660 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
12670 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
12680 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
12690 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
126a0 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
126b0 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
126c0 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
126d0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
126e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
126f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12700 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12730 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
12740 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
12750 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
12760 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12770 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
12780 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75  r here */.  BtCu
12790 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
127b0 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65  ursor to receive
127c0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55   the page, or NU
127d0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  LL */.  int bRea
127e0 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  dOnly           
127f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12800 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
12810 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
12820 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
12830 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
12840 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12850 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
12870 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d  ur==0 || ppPage=
12880 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  =&pCur->pPage );
12890 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
128a0 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
128b0 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
128c0 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
128d0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
128e0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
128f0 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
12900 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
12910 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12920 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
12930 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
12940 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3b 0a 20  itPage_error1;. 
12950 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12960 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
12970 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
12980 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
12990 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69   bReadOnly);.  i
129a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  f( rc ){.    got
129b0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
129c0 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 2a  _error1;.  }.  *
129d0 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  ppPage = (MemPag
129e0 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
129f0 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
12a00 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ;.  if( (*ppPage
12a10 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
12a20 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f      btreePageFro
12a30 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
12a40 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20   pgno, pBt);.   
12a50 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
12a60 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
12a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
12a90 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
12aa0 5f 65 72 72 6f 72 32 3b 0a 20 20 20 20 7d 0a 20  _error2;.    }. 
12ab0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
12ac0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
12ad0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
12ae0 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
12af0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
12b00 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
12b10 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  ;..  /* If obtai
12b20 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
12b30 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
12b40 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
12b50 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
12b60 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
12b70 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
12b80 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
12b90 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d  r && ((*ppPage)-
12ba0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70  >nCell<1 || (*pp
12bb0 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70  Page)->intKey!=p
12bc0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20  Cur->curIntKey) 
12bd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12be0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
12bf0 70 67 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20  pgno);.    goto 
12c00 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
12c10 72 72 6f 72 32 3b 0a 20 20 7d 0a 20 20 72 65 74  rror2;.  }.  ret
12c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
12c30 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
12c40 72 72 6f 72 32 3a 0a 20 20 72 65 6c 65 61 73 65  rror2:.  release
12c50 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 67  Page(*ppPage);.g
12c60 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12c70 72 6f 72 31 3a 0a 20 20 69 66 28 20 70 43 75 72  ror1:.  if( pCur
12c80 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
12c90 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d  age--;.    pCur-
12ca0 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
12cb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
12cc0 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  e];.  }.  testca
12cd0 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
12ce0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
12cf0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
12d00 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
12d10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12d20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
12d30 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
12d40 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
12d50 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
12d60 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
12d70 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  tPage..**.** Pag
12d80 65 31 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  e1 is a special 
12d90 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20 62 65  case and must be
12da0 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
12db0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 29  releasePageOne()
12dc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12dd0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
12de0 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
12df0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
12e00 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
12e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12e20 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
12e30 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
12e40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12e50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
12e60 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
12e70 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
12e80 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
12e90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
12ea0 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
12eb0 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
12ec0 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12ed0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12ee0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12ef0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12f00 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
12f10 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
12f20 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
12f30 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
12f40 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
12f50 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
12f60 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
12f70 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  l(pPage);.}.stat
12f80 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
12f90 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a  ageOne(MemPage *
12fa0 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
12fb0 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ( pPage!=0 );.  
12fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
12fd0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
12fe0 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
12ff0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
13000 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20  >pDbPage!=0 );. 
13010 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13020 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
13030 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
13040 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
13050 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13060 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
13070 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
13080 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
13090 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
130a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
130b0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
130c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
130d0 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 70 50  rUnrefPageOne(pP
130e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d  age->pDbPage);.}
130f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
13100 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
13110 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
13120 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
13130 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
13140 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
13150 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
13160 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
13170 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
13180 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
13190 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
131a0 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
131b0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
131c0 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
131d0 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
131e0 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
131f0 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
13200 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
13210 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
13220 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
13230 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
13240 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
13250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13260 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
13270 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
13280 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
13290 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
132a0 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
132b0 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
132c0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
132d0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
132e0 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
132f0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
13300 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
13310 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13320 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
13330 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
13340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13350 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
13360 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
13370 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
13380 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
13390 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
133a0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
133b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
133c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
133d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
133e0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
133f0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
13400 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
13410 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
13420 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
13430 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
13440 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
13450 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
13460 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
13470 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
13480 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
13490 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
134a0 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
134b0 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
134c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
134d0 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
134e0 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
134f0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
13500 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13510 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
13520 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
13530 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
13540 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
13550 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
13560 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
13570 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13580 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
13590 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
135a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
135b0 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
135c0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
135d0 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
135e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
135f0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
13600 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
13610 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
13620 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
13630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13640 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
13650 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
13660 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
13670 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13680 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
13690 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
136a0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
136b0 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
136c0 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
136d0 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
136e0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
136f0 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
13700 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
13710 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
13720 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
13730 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
13740 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
13750 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
13760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
13770 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
13780 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
13790 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
137a0 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
137b0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
137c0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
137d0 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
137e0 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
137f0 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
13800 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
13810 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
13820 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
13830 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
13840 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
13850 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
13860 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
13870 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
13880 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
13890 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
138a0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
138b0 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
138c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
138d0 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
138e0 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
138f0 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
13900 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13910 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
13920 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
13930 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
13940 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
13950 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c  db->busyHandler,
13960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13980 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46     sqlite3PagerF
13990 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
139a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
139b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
139c0 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
139d0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
139e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
139f0 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
13a00 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
13a10 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
13a20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
13a30 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
13a40 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
13a50 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
13a60 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
13a70 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
13a80 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
13a90 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
13aa0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
13ab0 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13ac0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
13ad0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
13ae0 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
13af0 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
13b00 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
13b10 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
13b20 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
13b30 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
13b40 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
13b50 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
13b60 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
13b70 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
13b80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
13b90 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
13ba0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
13bb0 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
13bc0 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
13bd0 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
13be0 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
13bf0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
13c00 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
13c10 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
13c20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
13c30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
13c40 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
13c50 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
13c60 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
13c70 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
13c80 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
13c90 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
13ca0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
13cb0 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
13cc0 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
13cd0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13ce0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
13cf0 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
13d00 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
13d10 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
13d20 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
13d30 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
13d40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13d50 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
13d60 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
13d70 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
13d80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
13d90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13da0 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
13db0 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
13dc0 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
13dd0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
13de0 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
13df0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
13e00 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
13e10 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
13e20 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
13e30 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
13e40 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
13e50 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
13e60 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
13e70 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
13e80 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
13e90 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
13ea0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
13eb0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
13ec0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
13ed0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
13ee0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
13ef0 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
13f00 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
13f10 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
13f20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
13f30 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
13f40 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
13f50 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
13f60 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
13f70 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
13f80 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
13f90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13fa0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
13fb0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
13fc0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
13fd0 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
13fe0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
13ff0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
14000 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
14010 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
14020 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
14030 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
14040 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
14050 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
14060 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
14070 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
14080 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
14090 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
140a0 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
140b0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
140c0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
140d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
140e0 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
140f0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
14100 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14110 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
14120 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
14130 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
14140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14150 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
14160 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
14170 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
14180 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
14190 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
141a0 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
141b0 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
141c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
141d0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
141e0 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
141f0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
14200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14210 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
14220 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
14230 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
14240 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
14250 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
14260 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
14270 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14280 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
14290 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
142a0 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
142b0 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
142c0 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
142d0 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
142e0 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
142f0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
14300 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
14310 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
14320 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
14330 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
14340 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
14350 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
14360 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
14370 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
14380 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
14390 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
143a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
143b0 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
143c0 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
143d0 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
143e0 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
143f0 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
14400 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
14410 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
14420 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
14430 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
14440 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
14450 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
14460 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
14470 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
14480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
14490 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
144a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
144b0 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
144c0 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
144d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
144e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
144f0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
14500 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
14510 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
14520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14530 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
14540 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
14550 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
14560 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
14570 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14580 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14590 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
145a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
145b0 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
145c0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
145d0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
145e0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
145f0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
14600 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
14610 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
14620 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
14630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
14640 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
14650 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
14660 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
14670 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
14680 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
14690 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
146a0 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
146b0 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
146c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
146d0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
146e0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
146f0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
14700 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
14710 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
14720 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
14730 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
14740 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
14750 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
14760 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14770 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
14780 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
14790 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
147a0 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
147b0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
147c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
147d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
147e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
147f0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
14800 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
14810 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
14820 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
14830 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
14840 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
14850 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
14860 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
14870 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
14880 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
148b0 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
148c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
148d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
148e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
148f0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
14900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
14910 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14920 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
14930 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
14940 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
14950 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
14960 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
14970 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14980 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14990 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
149a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
149b0 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
149c0 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
149d0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
149e0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
149f0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a10 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14a20 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
14a30 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
14a40 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14a50 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14a60 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
14a70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
14a80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14a90 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
14aa0 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
14ab0 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
14ac0 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
14ad0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
14ae0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
14af0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
14b00 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
14b10 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
14b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
14b30 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
14b40 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
14b50 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
14b60 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
14b70 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
14b80 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14b90 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
14ba0 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
14bb0 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
14bc0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
14bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
14be0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14bf0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
14c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
14c10 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14c20 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
14c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14c40 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
14c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
14c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
14c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
14c90 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
14ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14cb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
14cc0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
14cd0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
14ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14cf0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14d00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14d10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14d20 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14d30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
14d50 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14d60 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
14d70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
14d80 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
14d90 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
14da0 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
14db0 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
14dc0 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
14dd0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
14de0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
14df0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
14e00 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
14e10 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
14e20 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
14e30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
14e40 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
14e50 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
14e60 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
14e70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
14e80 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
14e90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
14ea0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
14eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
14ec0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
14ed0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
14ee0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
14ef0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
14f00 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
14f10 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
14f20 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
14f30 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
14f40 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
14f50 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
14f60 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
14f70 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
14f80 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
14f90 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14fa0 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
14fb0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14fc0 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
14fd0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
14fe0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
14ff0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
15000 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
15010 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
15020 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
15030 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
15040 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
15050 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
15060 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
15070 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15080 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
15090 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
150a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
150b0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
150c0 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
150d0 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
15100 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73  (MemPage), flags
15110 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
15120 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
15130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15150 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
15160 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
15170 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
15180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15190 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
151a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
151b0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
151c0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
151d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
151e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
151f0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15200 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
15210 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
15220 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
15230 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
15240 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15250 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d  BusyHandler(pBt-
15260 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
15270 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
15280 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
15290 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
152a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
152b0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
152c0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
152d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
152e0 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
152f0 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
15300 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
15310 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  NLY;.#if defined
15320 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44  (SQLITE_SECURE_D
15330 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e  ELETE).    pBt->
15340 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15350 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
15360 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
15370 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f  ITE_FAST_SECURE_
15380 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
15390 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
153a0 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64  _OVERWRITE;.#end
153b0 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
153c0 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
153d0 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
153e0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
153f0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
15400 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
15410 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
15420 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
15430 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
15440 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
15450 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
15460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15470 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
15480 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
15490 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
154a0 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
154b0 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
154c0 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
154d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
154e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
154f0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
15500 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
15510 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
15520 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
15530 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
15540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15550 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15560 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15570 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
15580 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
15590 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
155a0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
155b0 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
155c0 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
155d0 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
155e0 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
155f0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
15600 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
15610 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
15620 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
15630 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
15640 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
15650 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
15660 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
15670 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
15680 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
15690 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
156a0 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
156b0 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
156c0 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
156d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
156e0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
156f0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
15700 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
15710 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
15720 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
15730 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
15740 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
15750 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
15760 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
15770 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
15780 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15790 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
157a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
157c0 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
157d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
157e0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
157f0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
15800 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
15810 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
15820 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
15830 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
15840 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
15850 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15860 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
15870 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
15880 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
15890 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
158a0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
158b0 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
158c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
158d0 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
158e0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
158f0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
15900 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
15910 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
15920 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
15930 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
15940 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
15950 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
15960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15970 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
15980 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
15990 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
159a0 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
159b0 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
159c0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
159d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
159e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
159f0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
15a00 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
15a10 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
15a20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
15a30 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
15a40 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
15a50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15a60 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
15a70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15a80 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
15a90 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
15aa0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15ab0 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
15ac0 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
15ad0 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
15ae0 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
15af0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  ;.    if( p->sha
15b00 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
15b10 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15b20 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
15b30 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
15b40 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
15b50 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
15b60 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
15b70 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
15b80 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
15b90 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
15ba0 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
15bb0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
15bc0 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
15bd0 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
15be0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
15bf0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
15c00 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
15c10 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
15c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
15c30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15c40 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
15c50 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
15c60 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
15c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
15c80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15c90 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15ca0 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
15cb0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
15cc0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15cd0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
15ce0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
15cf0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15d00 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
15d10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15d20 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15d30 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
15d40 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
15d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
15d90 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
15da0 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
15db0 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
15dc0 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
15dd0 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
15de0 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
15df0 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
15e00 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
15e10 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
15e20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
15e30 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
15e40 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
15e50 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
15e60 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
15e70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
15e80 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
15e90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
15ea0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
15eb0 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
15ec0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
15ed0 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
15ee0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
15ef0 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
15f00 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
15f10 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
15f20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70    if( (uptr)p->p
15f30 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70  Bt<(uptr)pSib->p
15f40 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
15f50 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
15f60 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
15f70 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
15f80 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
15f90 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
15fa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
15fb0 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
15fc0 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70  && (uptr)pSib->p
15fd0 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29  Next->pBt<(uptr)
15fe0 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
15ff0 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
16000 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
16010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16020 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
16030 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
16040 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
16050 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
16060 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
16070 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
16080 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
16090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
160a0 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
160b0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
160c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
160d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
160e0 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
160f0 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
16100 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
16110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16120 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
16130 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
16140 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
16150 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
16160 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
16170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
16180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16190 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
161a0 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
161b0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
161c0 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20  ile *pFile;..   
161d0 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
161e0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
161f0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
16200 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
16210 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
16220 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
16230 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
16240 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
16250 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
16260 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
16270 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
16280 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
16290 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
162a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
162b0 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
162c0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
162d0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
162e0 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
162f0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
16300 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
16310 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
16320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
16330 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
16340 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
16350 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
16360 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
16370 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
16380 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
16390 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74  PDB, (void*)&pBt
163a0 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->db);.    }.  }
163b0 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
163c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
163d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
163e0 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
163f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
16400 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
16410 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
16420 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
16430 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
16440 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28  ConnectionCount(
16450 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20  *ppBtree)>0 );. 
16460 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16470 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
16480 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
16490 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
164a0 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
164b0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
164c0 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
164d0 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
164e0 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
164f0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
16500 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
16510 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
16520 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
16530 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
16540 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
16550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
16560 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
16570 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
16580 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
16590 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
165a0 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
165b0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
165c0 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
165d0 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
165e0 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
165f0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
16600 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
16610 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16620 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
16630 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
16640 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16650 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
16660 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
16670 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16680 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
16690 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
166a0 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
166b0 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
166c0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
166d0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
166e0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
166f0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
16700 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
16710 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
16720 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
16730 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
16740 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
16750 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
16760 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
16770 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
16780 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
16790 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
167a0 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
167b0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
167c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
167d0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
167e0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
167f0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
16800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16810 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
16820 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
16830 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16840 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
16850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
16860 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
16870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
16880 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
16890 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
168a0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
168b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
168c0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
168d0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
168e0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
168f0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
16900 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
16910 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
16920 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
16930 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
16940 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
16950 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
16960 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
16970 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
16980 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16990 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
169a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
169b0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
169c0 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
169d0 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
169e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
169f0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
16a00 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
16a10 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
16a20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
16a30 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
16a40 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
16a50 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
16a60 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
16a70 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
16a80 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
16a90 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
16aa0 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
16ab0 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
16ac0 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
16ad0 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
16ae0 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
16af0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
16b00 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
16b10 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
16b20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
16b30 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
16b40 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
16b50 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
16b60 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
16b70 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
16b80 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
16b90 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
16ba0 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
16bb0 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
16bc0 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
16bd0 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
16be0 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
16bf0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
16c00 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
16c10 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
16c20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
16c30 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
16c40 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
16c50 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
16c60 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
16c70 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
16c80 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
16c90 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
16ca0 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
16cb0 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
16cc0 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
16cd0 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
16ce0 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
16cf0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
16d00 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
16d10 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16d20 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
16d30 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
16d40 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
16d50 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
16d60 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
16d70 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
16d80 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
16d90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
16da0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
16db0 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
16dc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16dd0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
16de0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16df0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
16e00 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
16e10 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
16e20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
16e30 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
16e40 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
16e50 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
16e60 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
16e70 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
16e80 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
16e90 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
16ea0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
16eb0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
16ec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16ed0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
16ee0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
16ef0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
16f00 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
16f10 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
16f20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16f30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16f40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16f50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f60 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
16f70 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
16f80 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
16f90 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
16fa0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
16fb0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
16fc0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
16fd0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
16fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
16ff0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
17000 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17010 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
17020 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
17030 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
17040 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
17050 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
17060 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
17070 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
17080 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
17090 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
170a0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
170b0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
170c0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
170d0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
170e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
170f0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17100 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
17110 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
17120 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
17130 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
17140 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
17150 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
17160 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
17170 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
17180 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
17190 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
171a0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
171b0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
171c0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
171d0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
171e0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
171f0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
17200 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
17210 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
17220 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
17230 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
17240 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
17250 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
17260 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
17270 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
17280 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
17290 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
172a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
172b0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
172c0 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
172d0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
172e0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b  >pPager, p->db);
172f0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
17300 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
17310 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
17320 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
17330 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
17340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
17350 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
17360 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
17370 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
17380 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
17390 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
173a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
173b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
173c0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
173d0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
173e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
173f0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
17400 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
17410 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
17420 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
17430 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
17440 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
17450 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
17460 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
17470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17480 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
17490 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69  ge the "soft" li
174a0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
174b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
174c0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73  e cache..** Unus
174d0 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65  ed and unmodifie
174e0 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  d pages will be 
174f0 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68  recycled when th
17500 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
17510 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
17520 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73  e exceeds this s
17530 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20  oft limit.  But 
17540 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
17550 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f  ** cache is allo
17560 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67  wed to grow larg
17570 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d  er than this lim
17580 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  it if it contain
17590 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73  s.** dirty pages
175a0 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20   or pages still 
175b0 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a  in active use..*
175c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
175d0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
175e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
175f0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
17600 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17620 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
17630 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
17640 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17650 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
17660 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
17670 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
17680 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
17690 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
176a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
176b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
176c0 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c  ge the "spill" l
176d0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
176e0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
176f0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20  he cache..** If 
17700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17710 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73  ges exceeds this
17720 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20   limit during a 
17730 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17740 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  n,.** the pager 
17750 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
17760 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74   "spill" pages t
17770 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61  o the journal ea
17780 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20  rly in.** order 
17790 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
177a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  y..**.** The val
177b0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
177c0 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
177d0 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20   size.  If zero 
177e0 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  is passed.** as 
177f0 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20  an argument, no 
17800 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
17810 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69   to the spill si
17820 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a  ze setting, so.*
17830 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f  * using mxPage o
17840 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20  f 0 is a way to 
17850 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
17860 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f  t spill size..*/
17870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17880 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74  eSetSpillSize(Bt
17890 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
178a0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
178b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
178c0 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
178d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
178e0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
178f0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
17900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17910 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50    res = sqlite3P
17920 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
17930 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
17940 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
17950 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17960 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
17970 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
17980 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
17990 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
179a0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
179b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
179c0 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
179d0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
179e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
179f0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
17a00 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
17a10 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
17a20 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17a30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17a40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17a50 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17a60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17a70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17a80 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
17a90 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
17aa0 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
17ab0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
17ac0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17ae0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
17af0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
17b00 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
17b10 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
17b20 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
17b30 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
17b40 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
17b50 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
17b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
17b70 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
17b80 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
17b90 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
17ba0 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
17bb0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
17bc0 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
17bd0 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
17be0 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
17bf0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
17c00 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
17c10 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
17c20 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
17c30 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
17c40 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
17c50 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
17c60 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
17c70 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
17c80 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
17c90 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
17ca0 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
17cb0 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
17cc0 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
17cd0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
17ce0 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
17cf0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
17d00 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
17d10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17d20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
17d30 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
17d40 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
17d50 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
17d60 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
17d70 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
17d80 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
17d90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
17da0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17db0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17dc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17dd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
17df0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
17e00 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
17e10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17e20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17e30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17e40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
17e50 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
17e60 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
17e70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
17e80 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
17e90 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
17ea0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
17eb0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
17ec0 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
17ed0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
17ee0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
17ef0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
17f00 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
17f10 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
17f20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
17f30 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
17f40 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
17f50 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
17f60 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
17f70 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
17f80 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
17f90 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
17fa0 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
17fb0 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
17fc0 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
17fd0 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
17fe0 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
17ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18000 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
18010 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
18020 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
18030 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
18040 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
18050 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
18060 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
18070 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
18080 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
18090 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
180a0 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
180b0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
180c0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
180d0 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
180e0 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
180f0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
18100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
18110 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
18120 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
18130 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
18140 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
18150 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
18160 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
18170 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
18180 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
18190 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
181a0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
181b0 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
181c0 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
181d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
181e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
181f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18200 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
18210 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
18220 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
18230 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18240 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
18250 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
18260 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
18270 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18280 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
18290 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
182a0 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
182b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
182c0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
182d0 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
182e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
182f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18300 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
18310 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
18320 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
18330 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
18340 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
18350 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
18360 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
18370 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
18380 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
18390 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
183a0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
183b0 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
183c0 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
183d0 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
183e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
183f0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
18400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
18410 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
18420 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18430 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
18440 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
18450 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
18460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18470 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
18480 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
18490 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
184a0 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
184b0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
184c0 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
184d0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
184e0 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
184f0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
18500 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
18510 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18520 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18530 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18540 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
18550 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
18560 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18570 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
18580 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
18590 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
185a0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
185b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
185c0 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
185d0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
185e0 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
185f0 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
18600 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
18610 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
18620 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
18630 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
18640 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
18650 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
18660 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
18670 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
18680 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
18690 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
186a0 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
186b0 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
186c0 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
186d0 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
186e0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
186f0 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
18700 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
18710 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18720 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
18730 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
18740 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
18750 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
18760 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
18770 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
18780 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
18790 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
187a0 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
187b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
187c0 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
187d0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
187e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
187f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18800 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
18810 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
18820 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
18830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
18840 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
18850 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18860 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
18870 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
18880 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
18890 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
188a0 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
188b0 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
188c0 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
188d0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
188e0 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
188f0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
18900 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
18910 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
18920 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
18930 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
18940 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
18950 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
18960 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
18970 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
18980 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
18990 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
189a0 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
189b0 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
189c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
189d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
189e0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
189f0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18a00 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
18a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
18a20 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
18a30 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
18a40 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
18a50 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18a60 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
18a70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18a80 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
18a90 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
18aa0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18ab0 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
18ac0 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
18ad0 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
18ae0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
18af0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
18b00 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
18b10 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
18b20 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
18b30 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
18b40 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
18b50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18b60 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
18b70 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
18b80 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
18b90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18ba0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
18bb0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
18bc0 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
18bd0 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
18be0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18bf0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18c00 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn n;.}../*.** C
18c10 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73  hange the values
18c20 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43   for the BTS_SEC
18c30 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
18c40 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61  TS_OVERWRITE fla
18c50 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77  gs:.**.**    new
18c60 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f  Flag==0       Bo
18c70 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
18c80 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45  LETE and BTS_OVE
18c90 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61 72  RWRITE are clear
18ca0 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
18cb0 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==1       BTS_SE
18cc0 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20  CURE_DELETE set 
18cd0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18ce0 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20  E is cleared.** 
18cf0 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20     newFlag==2   
18d00 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44      BTS_SECURE_D
18d10 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e  ELETE cleared an
18d20 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
18d30 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77  is set.**    new
18d40 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f  Flag==(-1)    No
18d50 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54   changes.**.** T
18d60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
18d70 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20 6e   as a query if n
18d80 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74  ewFlag is less t
18d90 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57  han zero.**.** W
18da0 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ith BTS_OVERWRIT
18db0 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63  E set, deleted c
18dc0 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72  ontent is overwr
18dd0 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20  itten by zeros, 
18de0 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20  but.** freelist 
18df0 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 6e  leaf pages are n
18e00 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  ot written back 
18e10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
18e20 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a    Thus in-page.*
18e30 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  * deleted conten
18e40 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75  t is cleared, bu
18e50 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74  t freelist delet
18e60 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ed content is no
18e70 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54  t..**.** With BT
18e80 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c  S_SECURE_DELETE,
18e90 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69   operation is li
18ea0 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  ke BTS_OVERWRITE
18eb0 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
18ec0 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c  on.** that freel
18ed0 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
18ee0 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  re written back 
18ef0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18f00 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a  e, increasing.**
18f10 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64   the amount of d
18f20 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20  isk I/O..*/.int 
18f30 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
18f40 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
18f50 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
18f60 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
18f70 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
18f80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18f90 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
18fa0 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  t( BTS_OVERWRITE
18fb0 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  ==BTS_SECURE_DEL
18fc0 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72  ETE*2 );.  asser
18fd0 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55  t( BTS_FAST_SECU
18fe0 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49  RE==(BTS_OVERWRI
18ff0 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45  TE|BTS_SECURE_DE
19000 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e  LETE) );.  if( n
19010 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
19020 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
19030 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53  s &= ~BTS_FAST_S
19040 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42  ECURE;.    p->pB
19050 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19060 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
19070 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20  *newFlag;.  }.  
19080 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
19090 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
190a0 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43  _SECURE)/BTS_SEC
190b0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71  URE_DELETE;.  sq
190c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
190d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
190e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
190f0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
19100 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
19110 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
19120 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
19130 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
19140 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
19150 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
19160 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
19170 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
19180 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
19190 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
191a0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
191b0 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
191c0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
191d0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
191e0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
191f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19200 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
19210 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
19220 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
19230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19240 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
19250 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19260 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
19270 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19280 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
19290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
192a0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
192b0 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
192c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
192d0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
192e0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
192f0 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
19300 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
19310 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
19320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
19330 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
19340 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
19350 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
19360 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
19370 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
19380 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
19390 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
193a0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
193b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
193c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
193d0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
193e0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
193f0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
19400 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
19410 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
19420 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
19430 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
19440 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
19450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
19460 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
19470 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
19480 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
19490 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
194a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
194b0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
194c0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
194d0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
194e0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
194f0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
19500 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
19510 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
19520 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
19530 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
19540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19550 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19560 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
19570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
19580 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65   has not set the
19590 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f   safety-level fo
195a0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
195b0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73  connection.** us
195c0 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63  ing "PRAGMA sync
195d0 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66  hronous", and if
195e0 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
195f0 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
19600 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76  .** set to the v
19610 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
19620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
19630 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
19640 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20  eter,.** set it 
19650 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  so..*/.#if SQLIT
19660 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
19670 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
19680 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
19690 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20 21  ONOUS \.    && !
196a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
196b0 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63 20  MIT_WAL).static 
196c0 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74 53  void setDefaultS
196d0 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65 64  yncFlag(BtShared
196e0 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74 79   *pBt, u8 safety
196f0 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74  _level){.  sqlit
19700 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44  e3 *db;.  Db *pD
19710 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42 74  b;.  if( (db=pBt
19720 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62  ->db)!=0 && (pDb
19730 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a  =db->aDb)!=0 ){.
19740 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
19750 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
19760 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
19770 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  pDb++; }.    if(
19780 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d   pDb->bSyncSet==
19790 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d 3e  0 .     && pDb->
197a0 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61  safety_level!=sa
197b0 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20  fety_level .    
197c0 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61 44   && pDb!=&db->aD
197d0 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20  b[1] .    ){.   
197e0 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
197f0 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65  evel = safety_le
19800 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  vel;.      sqlit
19810 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
19820 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20  pBt->pPager,.   
19830 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
19840 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e  ty_level | (db->
19850 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c  flags & PAGER_FL
19860 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20  AGS_MASK));.    
19870 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
19880 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75 6c  define setDefaul
19890 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73 61  tSyncFlag(pBt,sa
198a0 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64  fety_level).#end
198b0 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  if../* Forward d
198c0 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
198d0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
198e0 62 61 73 65 28 42 74 53 68 61 72 65 64 2a 29 3b  base(BtShared*);
198f0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
19900 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
19910 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
19920 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
19930 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
19940 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
19950 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
19960 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
19970 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
19980 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
19990 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
199a0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
199b0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
199c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
199d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
199e0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
199f0 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
19a00 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
19a10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
19a20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19a30 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
19a40 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
19a50 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
19a60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
19a70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
19a80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
19a90 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
19aa0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
19ab0 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
19ac0 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
19ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19ae0 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 3b 20  */.  u32 nPage; 
19af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19b00 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19b10 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
19b20 20 20 75 33 32 20 6e 50 61 67 65 46 69 6c 65 20    u32 nPageFile 
19b30 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
19b40 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
19b60 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 48 65 61  /.  u32 nPageHea
19b70 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
19b80 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
19b90 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
19ba0 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
19bb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19bc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19bd0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
19be0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
19bf0 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
19c00 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
19c10 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
19c20 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
19c30 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
19c40 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
19c50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
19c60 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
19c70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19c80 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19c90 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
19ca0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
19cb0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
19cc0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
19cd0 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
19ce0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
19cf0 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
19d00 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
19d10 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
19d20 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
19d30 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19d40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
19d50 72 2c 20 28 69 6e 74 2a 29 26 6e 50 61 67 65 46  r, (int*)&nPageF
19d60 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
19d70 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
19d80 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
19d90 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
19da0 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
19db0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
19dc0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
19dd0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
19de0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
19df0 65 73 65 74 44 61 74 61 62 61 73 65 29 21 3d 30  esetDatabase)!=0
19e00 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
19e10 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  0;.  }.  if( nPa
19e20 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
19e30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
19e40 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
19e50 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
19e60 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
19e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
19e80 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
19e90 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
19ea0 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
19eb0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
19ec0 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
19ed0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
19ee0 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
19ef0 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
19f00 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
19f10 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
19f20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
19f30 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
19f40 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
19f50 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
19f60 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
19f70 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19f80 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
19f90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
19fa0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
19fb0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
19fc0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19fd0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
19fe0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
19ff0 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
1a000 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a010 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
1a020 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
1a030 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
1a040 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a050 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
1a060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a070 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
1a080 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a090 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a0a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1a0b0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
1a0c0 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
1a0d0 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
1a0e0 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
1a0f0 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
1a100 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
1a110 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1a120 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
1a130 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
1a140 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
1a150 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1a160 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
1a170 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
1a180 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
1a190 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
1a1a0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
1a1b0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
1a1c0 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
1a1d0 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
1a1e0 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
1a1f0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1a200 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
1a210 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
1a220 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
1a230 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
1a240 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
1a250 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
1a260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a270 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
1a280 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a290 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
1a2a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
1a2b0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
1a2c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a2d0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
1a2e0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
1a2f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a310 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a320 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
1a330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1a340 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
1a350 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45  g(pBt, SQLITE_DE
1a360 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
1a370 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20  ONOUS+1);.      
1a380 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
1a390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1a3a0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1a3b0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e1);.          r
1a3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a3e0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
1a3f0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
1a400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65   }else{.      se
1a410 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
1a420 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
1a430 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
1a440 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +1);.    }.#endi
1a450 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
1a460 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
1a470 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
1a480 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
1a490 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
1a4a0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
1a4b0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
1a4c0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
1a4d0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
1a4e0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
1a4f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
1a500 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
1a510 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
1a520 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
1a530 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
1a540 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
1a550 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
1a560 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
1a570 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
1a580 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
1a590 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
1a5a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1a5b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
1a5d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
1a5e0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
1a5f0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
1a600 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
1a610 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
1a620 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
1a630 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
1a640 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
1a650 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
1a660 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
1a670 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
1a680 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
1a690 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
1a6a0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
1a6b0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
1a6c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a6d0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
1a6e0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
1a6f0 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
1a700 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
1a710 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
1a720 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
1a730 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
1a740 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
1a750 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
1a760 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
1a770 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
1a780 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
1a790 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
1a7a0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a7b0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
1a7c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a7d0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
1a7e0 44 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  D;.    assert( (
1a7f0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
1a800 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
1a810 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d  NCE-OF: R-59310-
1a820 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72  51205 The "reser
1a830 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20  ved space" size 
1a840 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20  in the 1-byte.  
1a850 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20    ** integer at 
1a860 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65  offset 20 is the
1a870 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a880 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
1a890 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65   end of.    ** e
1a8a0 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65  ach page to rese
1a8b0 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f  rve for extensio
1a8c0 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ns. .    **.    
1a8d0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1a8e0 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
1a8f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
1a900 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
1a910 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
1a920 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
1a930 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
1a940 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
1a950 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
1a960 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
1a970 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
1a980 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65  r. */.    usable
1a990 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
1a9a0 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
1a9b0 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
1a9c0 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
1a9d0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
1a9e0 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
1a9f0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1aa00 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
1aa10 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
1aa20 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
1aa30 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
1aa40 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
1aa50 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
1aa60 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
1aa70 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
1aa80 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
1aa90 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
1aaa0 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
1aab0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
1aac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aad0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
1aae0 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
1aaf0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
1ab00 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
1ab10 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
1ab20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1ab30 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1ab40 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
1ab50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
1ab60 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
1ab70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1ab80 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1ab90 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
1aba0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
1abb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1abc0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
1abd0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
1abe0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
1ac10 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
1ac20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ac30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
1ac40 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
1ac50 6d 61 28 70 42 74 2d 3e 64 62 29 3d 3d 30 20 26  ma(pBt->db)==0 &
1ac60 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
1ac70 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1ac80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ac90 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1aca0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1acb0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1acc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1acd0 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
1ace0 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
1acf0 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
1ad00 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
1ad10 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
1ad20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1ad30 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1ad40 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
1ad50 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
1ad60 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
1ad70 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
1ad80 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
1ad90 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
1ada0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1adb0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1adc0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1add0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1ade0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1adf0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
1ae00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ae10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1ae20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
1ae30 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1ae40 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
1ae50 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
1ae60 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
1ae70 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1ae80 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
1ae90 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
1aea0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
1aeb0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
1aec0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
1aed0 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
1aee0 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
1aef0 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
1af00 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
1af10 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
1af20 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
1af30 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
1af40 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
1af50 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
1af60 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
1af70 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
1af80 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
1af90 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
1afa0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
1afb0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
1afc0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
1afd0 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
1afe0 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
1aff0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1b000 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
1b010 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1b020 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
1b030 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
1b040 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
1b050 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
1b060 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
1b070 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
1b080 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
1b090 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
1b0a0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
1b0b0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
1b0c0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
1b0d0 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
1b0e0 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
1b0f0 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
1b100 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1b110 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
1b120 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
1b130 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1b140 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1b150 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1b160 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
1b170 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
1b180 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
1b190 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
1b1a0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1b1b0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1b1c0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
1b1d0 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
1b1e0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1b1f0 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
1b200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
1b210 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1b220 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
1b230 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
1b240 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
1b250 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
1b260 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
1b270 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1b280 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
1b290 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1b2a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b2b0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
1b2c0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
1b2d0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1b2e0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1b2f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1b300 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1b310 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
1b320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
1b330 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
1b340 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1b350 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1b360 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1b370 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1b380 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1b390 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1b3a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
1b3b0 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
1b3c0 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
1b3d0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
1b3e0 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
1b3f0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
1b400 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
1b410 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1b420 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1b430 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
1b440 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1b450 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1b460 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
1b470 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1b480 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
1b490 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
1b4a0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
1b4b0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
1b4c0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
1b4d0 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
1b4e0 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
1b4f0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
1b500 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
1b510 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
1b520 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1b530 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1b540 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1b550 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1b560 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
1b570 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
1b580 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
1b590 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
1b5a0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
1b5b0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1b5c0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1b5d0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1b5e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1b5f0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1b600 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
1b610 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
1b620 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
1b630 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1b640 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
1b650 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b660 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
1b670 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1b680 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
1b690 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1b6a0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
1b6b0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
1b6c0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
1b6d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1b6e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1b6f0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1b700 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
1b710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1b720 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1b730 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
1b740 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
1b750 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
1b760 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b770 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1b780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1b790 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1b7a0 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
1b7b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b7c0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1b7d0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
1b7e0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1b7f0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
1b800 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
1b810 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1b820 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
1b830 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
1b840 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
1b850 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1b860 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
1b870 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
1b880 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
1b890 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1b8a0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1b8b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1b8c0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1b8d0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1b8e0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1b8f0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1b900 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1b910 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1b920 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1b930 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1b940 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1b950 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1b960 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1b970 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1b980 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1b990 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1b9a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b9b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b9c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1b9d0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1b9e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1b9f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ba00 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1ba10 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1ba20 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1ba30 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1ba40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ba50 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1ba60 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1ba70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1ba80 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1ba90 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1baa0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1bab0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1bac0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1bad0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1bae0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1baf0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1bb00 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1bb10 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1bb20 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1bb30 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1bb40 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1bb50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1bb60 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1bb70 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1bb80 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1bb90 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1bba0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1bbb0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1bbc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bbd0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1bbe0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1bbf0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1bc00 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1bc10 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1bc20 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1bc30 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1bc40 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1bc50 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1bc60 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1bc70 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1bc80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bc90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1bca0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1bcb0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1bcc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1bcd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bce0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1bcf0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1bd00 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1bd10 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1bd20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1bd30 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1bd40 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1bd50 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1bd60 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1bd70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1bd80 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1bd90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bda0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1bdb0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1bdc0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1bdd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1bde0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1bdf0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1be00 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1be10 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1be20 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1be30 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1be40 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1be50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1be60 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1be70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1be80 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1be90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1bea0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1beb0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1bec0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1bed0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1bee0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1bef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bf00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf10 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1bf20 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1bf30 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1bf40 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1bf50 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1bf60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1bf70 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1bf80 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1bf90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1bfa0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1bfb0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1bfc0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1bfd0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1bfe0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1bff0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1c000 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1c010 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1c020 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1c030 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1c040 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1c050 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1c060 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1c070 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1c080 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1c090 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1c0a0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1c0b0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1c0c0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1c0d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1c0e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1c0f0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c100 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1c110 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1c120 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1c130 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1c140 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1c150 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1c160 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1c170 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1c180 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1c190 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1c1a0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1c1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1c1c0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1c1d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c1e0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1c1f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c200 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1c210 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c220 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1c230 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1c240 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1c250 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1c260 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1c270 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1c280 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1c290 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1c2a0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1c2b0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1c2c0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1c2d0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1c2e0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1c2f0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c300 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1c310 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1c320 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1c330 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1c340 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1c350 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1c360 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1c370 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1c380 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1c390 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1c3a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c3b0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1c3c0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1c3d0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1c3e0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1c3f0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1c400 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1c410 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1c420 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1c430 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1c440 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1c450 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1c460 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1c470 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1c480 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1c490 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1c4a0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1c4b0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1c4c0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1c4d0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1c4e0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1c4f0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1c500 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1c510 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1c520 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1c530 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1c540 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1c550 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1c560 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1c570 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1c580 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1c590 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1c5a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c5b0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1c5c0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1c5d0 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68  rflag, int *pSch
1c5e0 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42  emaVersion){.  B
1c5f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c600 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1c610 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c620 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c630 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1c640 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1c650 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1c660 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1c670 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1c680 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1c690 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1c6a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1c6b0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1c6c0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1c6d0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1c6e0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1c6f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1c700 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1c710 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c720 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1c730 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1c740 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1c750 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1c760 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c770 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1c780 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1c790 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1c7a0 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66  .  if( (p->db->f
1c7b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c7c0 73 65 74 44 61 74 61 62 61 73 65 29 20 0a 20 20  setDatabase) .  
1c7d0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
1c7e0 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
1c7f0 70 50 61 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b  pPager)==0 .  ){
1c800 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
1c810 67 73 20 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f  gs &= ~BTS_READ_
1c820 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
1c830 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  Write transactio
1c840 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69  ns are not possi
1c850 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e  ble on a read-on
1c860 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
1c870 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1c880 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1c890 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61  NLY)!=0 && wrfla
1c8a0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
1c8b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1c8c0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1c8d0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
1c8e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1c8f0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20  ARED_CACHE.  {. 
1c900 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f     sqlite3 *pBlo
1c910 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49  ck = 0;.    /* I
1c920 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
1c930 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
1c940 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
1c950 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1c960 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73   .    ** on this
1c970 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
1c980 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
1c990 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
1c9a0 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  action is.    **
1c9b0 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
1c9c0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
1c9d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c9e0 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
1c9f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ca00 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20  TRANS_WRITE).   
1ca10 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
1ca20 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
1ca30 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  G)!=0.    ){.   
1ca40 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
1ca50 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
1ca60 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
1ca70 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74  ag>1 ){.      Bt
1ca80 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
1ca90 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
1caa0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1cab0 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1cac0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
1cad0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1cae0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  p ){.          p
1caf0 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
1cb00 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
1cb10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cb30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f    }.    if( pBlo
1cb40 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
1cb50 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
1cb60 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
1cb70 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ck);.      rc = 
1cb80 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
1cb90 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20  AREDCACHE;.     
1cba0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1cbb0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  n;.    }.  }.#en
1cbc0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
1cbd0 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
1cbe0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1cbf0 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
1cc00 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
1cc10 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
1cc20 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
1cc30 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
1cc40 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
1cc50 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
1cc60 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
1cc70 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
1cc80 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
1cc90 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
1cca0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
1ccb0 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
1ccc0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
1ccd0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
1cce0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1ccf0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1cd00 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
1cd10 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
1cd20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
1cd30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1cd40 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1cd50 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
1cd60 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
1cd70 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
1cd80 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
1cd90 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
1cda0 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
1cdb0 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
1cdc0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
1cdd0 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
1cde0 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
1cdf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce00 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
1ce10 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
1ce20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
1ce30 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
1ce40 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
1ce50 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1ce60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
1ce70 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
1ce80 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
1ce90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
1cea0 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
1ceb0 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
1cec0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
1ced0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1cee0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1cef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
1cf00 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
1cf10 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
1cf20 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
1cf30 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
1cf40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cf50 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1cf60 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
1cf70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1cf80 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
1cf90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cfa0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1cfb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cfc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cfd0 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
1cfe0 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
1cff0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
1d000 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
1d010 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d030 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1d040 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1d050 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1d060 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
1d070 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  OT && pBt->inTra
1d080 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d090 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
1d0a0 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20 77 61    /* if there wa
1d0b0 73 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  s no transaction
1d0c0 20 6f 70 65 6e 65 64 20 77 68 65 6e 20 74 68 69   opened when thi
1d0d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20  s function was. 
1d0e0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c           ** call
1d0f0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  ed and SQLITE_BU
1d100 53 59 5f 53 4e 41 50 53 48 4f 54 20 69 73 20 72  SY_SNAPSHOT is r
1d110 65 74 75 72 6e 65 64 2c 20 63 68 61 6e 67 65 20  eturned, change 
1d120 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1d130 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53      ** code to S
1d140 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20  QLITE_BUSY. */. 
1d150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1d160 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1d170 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d180 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
1d190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d1a0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
1d1b0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1d1c0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
1d1d0 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
1d1e0 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
1d1f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1d200 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
1d210 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
1d220 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
1d230 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1d240 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f  erResetLockTimeo
1d250 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ut(pBt->pPager);
1d260 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1d270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1d280 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d290 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1d2a0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1d2b0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
1d2c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1d2d0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
1d2e0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
1d2f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d300 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
1d310 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
1d320 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
1d330 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
1d340 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
1d350 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
1d360 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
1d370 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
1d380 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
1d390 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d3a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
1d3b0 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
1d3c0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
1d3d0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
1d3e0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
1d3f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1d400 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1d410 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
1d420 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
1d430 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
1d440 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
1d450 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1d460 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
1d470 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1d480 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
1d490 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
1d4a0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
1d4b0 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
1d4c0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1d4d0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
1d4e0 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
1d4f0 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
1d500 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
1d510 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
1d520 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d530 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
1d540 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
1d550 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
1d560 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
1d570 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
1d580 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
1d590 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
1d5a0 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
1d5b0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
1d5c0 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
1d5d0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
1d5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d5f0 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
1d600 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
1d610 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1d620 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
1d630 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
1d640 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
1d650 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
1d660 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1d670 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1d680 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d690 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
1d6a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d6b0 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
1d6c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d6d0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1d6e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1d6f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d710 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d720 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1d730 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1d740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d750 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73      }.  }..trans
1d760 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
1d770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d780 20 20 20 69 66 28 20 70 53 63 68 65 6d 61 56 65     if( pSchemaVe
1d790 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 2a  rsion ){.      *
1d7a0 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 3d  pSchemaVersion =
1d7b0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1d7c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 34 30  pPage1->aData[40
1d7d0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
1d7e0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1d7f0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1d800 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1d810 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1d820 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1d830 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 6e  of.      ** open
1d840 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
1d850 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1d860 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
1d870 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 20  than 0 and.     
1d880 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
1d890 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
1d8a0 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
1d8b0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
1d8c0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
1d8d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d8e0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1d8f0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1d900 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1d910 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
1d920 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1d930 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1d940 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1d950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1d960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d970 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1d980 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1d990 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1d9a0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1d9b0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1d9c0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1d9d0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1d9e0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1d9f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1da00 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1da10 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1da20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1da30 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1da40 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1da50 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1da60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1da70 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1daa0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1dab0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dad0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1dae0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1daf0 0a 20 20 69 6e 74 20 72 63 3b 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 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1db20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1db30 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1db40 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
1db50 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1db60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1db70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1db80 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1db90 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67  ) );.  rc = pPag
1dba0 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49  e->isInit ? SQLI
1dbb0 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69  TE_OK : btreeIni
1dbc0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1dbd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dbe0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1dbf0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1dc00 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1dc10 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1dc20 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1dc30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1dc40 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1dc50 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1dc60 65 2c 20 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  e, pPage, pCell,
1dc70 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1dc80 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1dc90 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1dca0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1dcb0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1dcc0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1dcd0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1dce0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1dcf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1dd00 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1dd10 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1dd20 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1dd30 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1dd40 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1dd50 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1dd60 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1dd70 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1dd80 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1dd90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1dda0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1ddb0 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1ddc0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1ddd0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1dde0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1ddf0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1de00 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1de10 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1de20 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1de30 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1de40 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1de50 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1de60 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1de70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1de80 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1de90 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1dea0 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1deb0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1dec0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1ded0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1dee0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1def0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1df00 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1df10 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1df30 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1df40 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1df50 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1df60 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1df70 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1df80 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1df90 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1dfa0 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1dfb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dfc0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1dfd0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1dfe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1dff0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1e000 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1e010 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1e020 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1e030 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e040 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1e050 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1e060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1e070 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1e080 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1e090 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1e0a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e0b0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1e0c0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1e0d0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1e0e0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1e0f0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1e100 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1e110 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1e120 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1e130 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e140 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1e150 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
1e160 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1e170 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1e180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1e190 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1e1a0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1e1b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69     rc = pPage->i
1e1c0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1e1d0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1e1e0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1e1f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e200 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1e210 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1e220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1e230 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1e240 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1e250 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1e260 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1e270 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1e280 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1e290 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1e2a0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1e2b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1e2c0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1e2d0 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1e2e0 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1e2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e300 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
1e310 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
1e320 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  a+pPage->pBt->us
1e330 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
1e340 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1e350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1e360 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1e370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e380 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
1e390 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1e3a0 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20  nSize-4) ){.    
1e3b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e3c0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1e3d0 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1e3e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e3f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e400 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1e410 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1e420 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1e430 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1e440 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1e450 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1e460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e470 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e480 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1e490 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1e4a0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1e4b0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1e4c0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1e4d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1e4e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1e4f0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1e500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e510 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1e520 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e530 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1e540 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1e550 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
1e560 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
1e570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e580 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1e590 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1e5a0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1e5b0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1e5c0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1e5d0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1e5e0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1e5f0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1e600 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1e610 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1e620 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1e630 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1e640 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1e650 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1e660 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1e670 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1e680 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1e690 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1e6a0 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1e6b0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1e6c0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1e6d0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1e6e0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1e6f0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1e700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1e710 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1e720 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1e730 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1e740 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e750 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1e760 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1e770 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e780 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1e790 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1e7a0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1e7b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1e7c0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1e7d0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1e7e0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1e7f0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1e800 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1e810 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1e820 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1e830 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1e840 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1e850 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1e860 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1e870 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1e880 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1e890 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1e8a0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1e8b0 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1e8c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1e8d0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1e8e0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1e8f0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1e900 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1e910 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1e920 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e930 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1e940 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1e950 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1e960 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1e970 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e980 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1e990 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e9a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e9b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1e9c0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1e9d0 3b 0a 20 20 69 66 28 20 69 44 62 50 61 67 65 3c  ;.  if( iDbPage<
1e9e0 33 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  3 ) return SQLIT
1e9f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ea00 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1ea10 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1ea20 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1ea30 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1ea40 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1ea50 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1ea60 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1ea70 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1ea80 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1ea90 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1eaa0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1eab0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1eac0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1ead0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1eae0 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1eaf0 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1eb00 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1eb10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1eb20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1eb30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1eb40 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1eb50 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1eb60 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1eb70 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1eb80 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1eb90 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1eba0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1ebb0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1ebc0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1ebd0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1ebe0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1ebf0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1ec00 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1ec10 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1ec20 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1ec30 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1ec40 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1ec50 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1ec60 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1ec70 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1ec80 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1ec90 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1eca0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1ecb0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1ecc0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1ecd0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1ece0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1ecf0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1ed00 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1ed10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1ed20 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1ed30 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1ed40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1ed50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ed60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ed70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1ed80 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1ed90 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1eda0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1edb0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1edc0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1edd0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1ede0 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1edf0 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1ee00 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1ee10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ee20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1ee30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ee40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ee50 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1ee60 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1ee70 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1ee80 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1ee90 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1eea0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1eeb0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1eec0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1eed0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1eee0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1eef0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1ef00 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1ef10 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1ef20 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1ef30 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1ef40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ef50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ef60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ef70 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1ef80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1ef90 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1efa0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1efb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1efc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1efd0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1efe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1eff0 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1f000 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1f010 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1f020 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1f030 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f040 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1f050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f060 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1f070 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
1f080 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
1f090 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
1f0a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f0b0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1f0c0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
1f0d0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
1f0e0 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
1f0f0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1f100 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
1f110 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
1f120 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
1f130 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
1f140 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
1f150 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
1f160 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
1f170 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1f180 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
1f190 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
1f1a0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
1f1b0 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
1f1c0 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
1f1d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1f1e0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
1f1f0 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
1f200 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
1f210 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
1f220 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1f230 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
1f240 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
1f250 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
1f260 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
1f270 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
1f280 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
1f290 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
1f2a0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
1f2b0 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
1f2c0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
1f2d0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
1f2e0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1f2f0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1f300 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
1f310 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
1f320 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1f330 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
1f340 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1f350 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
1f360 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
1f370 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1f380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1f390 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
1f3a0 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
1f3b0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
1f3c0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
1f3d0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1f3e0 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
1f3f0 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
1f400 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
1f410 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
1f420 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
1f430 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
1f440 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
1f450 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1f460 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
1f470 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f480 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1f490 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
1f4a0 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
1f4b0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
1f4c0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
1f4d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1f4e0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
1f4f0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
1f500 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1f510 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f520 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1f530 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1f540 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
1f550 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
1f560 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1f570 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
1f580 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f590 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
1f5a0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
1f5b0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
1f5c0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
1f5d0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f5e0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f5f0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
1f600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1f610 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
1f620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1f630 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1f640 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
1f650 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
1f660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1f680 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1f690 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1f6a0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1f6b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f6c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f6d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f6e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1f6f0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1f700 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1f710 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
1f720 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
1f730 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
1f740 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
1f750 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
1f760 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
1f770 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
1f780 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
1f790 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
1f7a0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
1f7b0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1f7c0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1f7d0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
1f7e0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
1f7f0 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
1f800 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
1f810 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
1f820 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
1f830 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1f840 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
1f850 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1f860 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1f870 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f880 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1f890 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
1f8a0 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
1f8b0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
1f8c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1f8e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1f8f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f900 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
1f910 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
1f920 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1f930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f940 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
1f950 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
1f960 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f970 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
1f980 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
1f990 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
1f9a0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
1f9b0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
1f9c0 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
1f9d0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
1f9e0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1f9f0 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
1fa00 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
1fa10 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
1fa20 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
1fa30 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1fa40 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
1fa50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1fa60 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1fa70 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
1fa80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fa90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1faa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1fab0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1fac0 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
1fad0 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
1fae0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
1faf0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
1fb00 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
1fb10 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
1fb20 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
1fb30 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
1fb40 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
1fb50 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
1fb60 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
1fb70 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
1fb80 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1fb90 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
1fba0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
1fbb0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
1fbc0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
1fbd0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
1fbe0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
1fbf0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
1fc00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
1fc10 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1fc20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
1fc30 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
1fc40 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
1fc50 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
1fc60 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1fc70 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1fc80 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1fc90 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1fca0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1fcb0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
1fcc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1fcd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fce0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1fcf0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1fd00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1fd10 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1fd20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fd30 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1fd40 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
1fd50 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
1fd60 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
1fd70 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
1fd80 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
1fd90 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
1fda0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
1fdb0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
1fdc0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
1fdd0 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
1fde0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1fdf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fe00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fe10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fe20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fe30 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
1fe40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
1fe50 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
1fe60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
1fe70 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
1fe80 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
1fe90 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1fea0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
1feb0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1fec0 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
1fed0 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
1fee0 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
1fef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ff00 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
1ff10 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
1ff20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1ff30 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1ff40 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
1ff50 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
1ff60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
1ff70 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
1ff80 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
1ff90 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
1ffa0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1ffb0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
1ffc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
1ffd0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
1ffe0 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
1fff0 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
20000 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
20010 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
20020 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20040 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
20050 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
20060 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
20070 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
20080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
20090 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
200a0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
200b0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
200e0 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
200f0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
20100 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
20110 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
20120 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
20130 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
20140 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
20150 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
20160 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
20170 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
20180 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
20190 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
201a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
201b0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
201c0 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
201d0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
201e0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
201f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
20200 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
20210 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20220 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
20230 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20240 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
20250 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
20260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
20270 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
20280 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
20290 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
202a0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
202b0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
202c0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
202d0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
202e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
202f0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
20300 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
20310 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
20320 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
20330 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
20340 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
20350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
20360 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
20370 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20380 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
20390 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
203a0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
203b0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
203c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
203d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
203e0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
203f0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
20400 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
20410 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
20420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
20430 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
20440 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
20450 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
20460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
20470 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
20480 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
20490 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
204a0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
204b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
204c0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
204d0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
204e0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
204f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
20500 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
20510 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
20520 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
20530 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
20540 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
20550 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
20560 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
20570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20580 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
20590 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
205a0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
205b0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
205c0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
205d0 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
205e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
205f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20600 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
20610 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20620 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
20630 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20640 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
20650 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
20660 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
20670 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20690 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
206a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
206b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
206c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
206d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
206e0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
206f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
20700 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
20710 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
20720 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
20730 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
20740 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
20750 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
20760 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
20770 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
20780 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20790 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
207a0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
207b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
207c0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
207d0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
207e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
207f0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
20800 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
20810 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
20820 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
20830 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
20840 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
20850 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
20860 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
20870 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
20880 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20890 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
208a0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
208b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
208c0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
208d0 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71   )..  assert( sq
208e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
208f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
20900 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
20910 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
20920 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
20930 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
20940 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
20950 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
20960 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
20970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20980 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
20990 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
209a0 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
209b0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
209c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
209d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
209e0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
209f0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
20a00 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
20a10 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
20a20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
20a30 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
20a40 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
20a50 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
20a60 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
20a70 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
20a80 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
20a90 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
20aa0 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
20ab0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
20ac0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
20ad0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
20ae0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
20af0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
20b00 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
20b10 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
20b20 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
20b30 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
20b40 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
20b50 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
20b60 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
20b70 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
20b80 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
20b90 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
20ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20bb0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
20bc0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
20bd0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
20be0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
20bf0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
20c00 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
20c10 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
20c20 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
20c30 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20c40 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
20c50 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
20c60 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
20c70 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20c80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20c90 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
20ca0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
20cb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
20cc0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
20cd0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
20ce0 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
20cf0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
20d00 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
20d10 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
20d20 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
20d30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20d40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20d50 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
20d60 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
20d70 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20d80 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20d90 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
20da0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20db0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
20dc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
20dd0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
20de0 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
20df0 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
20e00 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
20e10 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
20e20 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
20e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20e40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20e50 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
20e60 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
20e70 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
20e80 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
20e90 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
20ea0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20eb0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
20ec0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20ed0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
20ee0 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
20ef0 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
20f00 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
20f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20f20 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
20f30 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
20f40 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
20f50 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
20f60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
20f70 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
20f80 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
20f90 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
20fa0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
20fb0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
20fc0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
20fd0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
20fe0 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
20ff0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
21000 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
21010 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
21020 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
21030 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
21040 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
21050 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
21060 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
21070 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
21080 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
21090 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
210a0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
210b0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
210c0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
210d0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
210e0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
210f0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
21100 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
21110 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
21120 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
21130 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
21140 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
21150 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
21160 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
21170 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
21180 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
21190 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
211a0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
211b0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
211c0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
211d0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
211e0 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
211f0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
21200 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
21210 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
21220 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
21230 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
21240 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
21250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21260 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
21270 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
21280 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
21290 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
212a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
212b0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
212c0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
212d0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
212e0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
212f0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
21300 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
21310 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
21320 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
21330 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
21340 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
21350 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
21360 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
21370 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
21380 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
21390 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
213a0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
213b0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
213c0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
213d0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
213e0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
213f0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
21400 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
21410 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
21420 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
21430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
21440 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
21450 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
21460 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21470 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
21480 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
21490 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
214a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
214b0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
214c0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
214d0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
214e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
214f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21500 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
21510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
21520 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
21530 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
21540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
21550 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
21560 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
21570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
21590 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
215a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
215b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
215c0 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
215d0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
215e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
215f0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
21600 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
21610 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
21620 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21630 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
21640 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
21650 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
21660 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21670 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
21680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21690 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
216a0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
216b0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
216c0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
216d0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
216e0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
216f0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
21700 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
21710 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
21720 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
21730 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
21740 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21750 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
21760 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
21770 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
21780 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
21790 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
217a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
217b0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
217c0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
217d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
217e0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
217f0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
21800 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
21810 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
21820 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
21830 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
21840 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
21850 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
21860 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
21870 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
21880 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
21890 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
218a0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
218b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
218c0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
218d0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
218e0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
218f0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21900 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
21910 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
21920 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
21930 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
21940 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
21950 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
21960 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
21970 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
21980 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
21990 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
219a0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
219b0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
219c0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
219d0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
219e0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
219f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
21a00 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
21a10 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
21a20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21a30 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
21a40 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
21a50 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21a60 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
21a70 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
21a80 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
21a90 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21aa0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
21ab0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21ac0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
21ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21ae0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
21af0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21b00 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
21b10 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
21b20 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
21b30 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
21b40 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
21b50 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
21b60 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
21b70 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21b80 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
21b90 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
21ba0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
21bb0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
21bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
21bd0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
21be0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
21bf0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
21c00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
21c10 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
21c20 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
21c30 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
21c40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
21c50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
21c60 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
21c70 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
21c80 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
21c90 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
21ca0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
21cb0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
21cc0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21cd0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
21ce0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
21cf0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
21d00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
21d10 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
21d20 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
21d30 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
21d40 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
21d50 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
21d60 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
21d70 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
21d80 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
21d90 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
21da0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
21db0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
21dc0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
21dd0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
21de0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
21df0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
21e00 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
21e10 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
21e20 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
21e30 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
21e40 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
21e50 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
21e60 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
21e70 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
21e80 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21e90 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
21ea0 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
21eb0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
21ec0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
21ed0 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
21ee0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
21ef0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
21f00 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
21f10 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
21f20 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
21f30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
21f40 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
21f50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
21f60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
21f70 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
21f80 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
21f90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
21fa0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
21fb0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
21fc0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
21fd0 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
21fe0 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
21ff0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
22000 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
22010 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
22020 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
22030 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
22040 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
22050 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
22060 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
22070 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
22080 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
22090 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
220a0 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
220b0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
220c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
220d0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
220e0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
220f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
22100 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
22110 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
22120 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
22130 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
22140 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22150 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22160 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
22170 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
22180 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
22190 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
221a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
221b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
221c0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
221d0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
221e0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
221f0 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
22200 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
22210 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
22220 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
22230 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
22240 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
22250 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
22260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
22270 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22280 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
22290 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
222a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
222b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
222c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
222d0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
222e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
222f0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
22300 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22310 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
22320 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
22330 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
22340 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
22350 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
22360 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22370 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
22380 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22390 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
223a0 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
223b0 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
223c0 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
223d0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
223e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
223f0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
22400 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
22410 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
22420 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
22430 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
22440 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
22470 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
22480 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
22490 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
224a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
224b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
224c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
224d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
224e0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
224f0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
22500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
22520 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
22530 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
22540 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22550 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
22560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22570 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
22580 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
22590 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
225a0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
225b0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
225c0 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
225d0 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
225e0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
225f0 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
22600 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
22610 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
22620 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
22630 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
22640 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
22650 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
22660 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
22670 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
22680 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
22690 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
226a0 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
226b0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
226c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
226d0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
226e0 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
226f0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
22700 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22710 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
22720 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
22730 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
22740 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
22750 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
22760 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
22770 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
22780 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
22790 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
227a0 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
227b0 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
227c0 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
227d0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
227e0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
227f0 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
22800 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
22810 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
22820 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
22830 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22840 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
22850 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
22860 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
22870 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
22880 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
22890 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
228a0 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
228b0 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
228c0 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
228d0 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
228e0 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
228f0 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
22900 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
22910 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
22920 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
22930 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
22940 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
22950 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
22960 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
22970 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
22980 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
22990 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
229a0 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
229b0 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
229c0 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
229d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
229e0 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
229f0 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
22a00 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
22a10 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
22a20 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
22a30 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
22a40 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22a50 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
22a60 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
22a70 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
22a80 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
22a90 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
22aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22ab0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
22ac0 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
22ad0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
22ae0 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
22af0 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
22b00 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
22b10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
22b20 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
22b30 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b40 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22b50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
22b60 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
22b70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
22b80 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
22b90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22ba0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22bb0 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
22bc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
22bd0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
22be0 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
22bf0 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
22c00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22c20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
22c30 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22c40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
22c50 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
22c60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
22ca0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
22cb0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
22cc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
22cd0 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
22ce0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
22cf0 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
22d00 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
22d10 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
22d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22d30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
22d40 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
22d50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22d60 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
22d70 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
22d80 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
22d90 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
22da0 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
22db0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
22dc0 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
22dd0 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
22de0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
22df0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
22e00 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
22e10 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
22e20 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
22e30 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
22e40 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
22e50 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
22e60 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
22e70 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
22e80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
22e90 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
22ea0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
22eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22ec0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
22ed0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
22ee0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
22ef0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
22f00 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
22f10 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
22f20 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
22f30 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
22f40 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
22f50 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
22f60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
22f70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
22f80 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
22f90 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
22fa0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
22fb0 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
22fc0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
22fd0 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
22fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
22ff0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
23000 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
23010 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
23020 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
23030 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
23040 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
23050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
23060 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
23070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
23080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23090 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
230a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
230b0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
230c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
230d0 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
230e0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
230f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
23100 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
23110 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
23120 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
23130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
23140 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
23150 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
23160 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
23170 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23180 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
23190 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
231a0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
231b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
231c0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
231d0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
231e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
231f0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
23200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
23210 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
23220 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
23230 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
23240 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
23250 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
23260 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
23270 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
23280 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
23290 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
232a0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
232b0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
232c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
232d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
232e0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
232f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23300 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
23310 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
23320 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
23330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
23340 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
23350 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
23360 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
23370 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
23380 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
23390 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
233a0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
233b0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
233c0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
233d0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
233e0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
233f0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
23400 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
23410 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
23420 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
23430 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
23440 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
23450 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
23460 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
23470 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
23480 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23490 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
234a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
234b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
234c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
234d0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
234e0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
234f0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
23500 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
23510 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
23520 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
23530 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
23540 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
23550 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
23560 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
23570 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
23580 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
23590 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
235a0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
235b0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
235c0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
235d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
235e0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
235f0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
23600 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
23610 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
23620 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
23630 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
23640 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
23650 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
23660 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
23670 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
23680 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
23690 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
236a0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
236b0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
236c0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
236d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
236e0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
236f0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
23700 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
23710 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
23720 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
23730 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
23740 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
23750 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
23760 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
23770 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
23780 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
23790 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
237a0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
237b0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
237c0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
237d0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
237e0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
237f0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
23800 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
23810 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
23820 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
23830 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
23840 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
23850 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
23860 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
23870 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
23880 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
23890 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
238a0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
238b0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
238c0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
238d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
238e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
238f0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
23900 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
23910 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
23920 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
23930 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
23940 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
23950 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
23960 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
23970 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
23980 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
23990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
239a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
239b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
239c0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
239d0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
239e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
239f0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
23a00 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
23a10 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
23a20 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
23a30 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
23a40 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
23a50 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
23a60 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
23a70 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
23a80 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
23a90 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
23aa0 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
23ab0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
23ac0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
23ad0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
23ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
23af0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
23b00 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
23b10 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
23b20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
23b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23b40 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
23b50 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
23b60 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
23b70 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
23b80 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
23b90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
23ba0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
23bb0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
23bc0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
23bd0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
23be0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
23bf0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
23c00 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
23c10 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
23c20 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
23c30 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
23c40 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
23c50 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
23c60 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
23c70 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
23c80 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
23c90 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
23ca0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
23cb0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
23cc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
23cd0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
23ce0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
23cf0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
23d00 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
23d10 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
23d20 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
23d30 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
23d40 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
23d50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
23d60 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
23d70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
23d80 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
23d90 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
23da0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
23db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23dc0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
23dd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
23de0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
23df0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23e00 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
23e10 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
23e20 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
23e30 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
23e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
23e50 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
23e60 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
23e70 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
23e80 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
23e90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23ea0 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ter(p);.    if( 
23eb0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23ec0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
23ed0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
23ee0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
23ef0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23f20 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
23f30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
23f40 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
23f50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f70 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
23f80 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
23f90 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
23fa0 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
23fb0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
23fc0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
23fd0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
23fe0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
23ff0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
24000 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
24010 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
24020 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
24030 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
24040 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
24050 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
24060 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
24070 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
24080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
24090 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
240a0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
240b0 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
240c0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
240d0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
240e0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
240f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24100 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24110 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24120 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
24130 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
24140 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
24150 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
24160 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
24170 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
24180 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
24190 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
241a0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
241b0 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
241c0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
241d0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
241e0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
241f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
24200 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
24210 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
24220 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
24230 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
24240 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
24250 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
24260 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
24270 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
24280 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
24290 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
242a0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
242b0 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
242c0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
242d0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
242e0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
242f0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
24300 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
24310 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
24320 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
24330 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
24340 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
24350 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
24360 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
24370 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
24380 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
24390 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
243a0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
243b0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
243c0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
243d0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
243e0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
243f0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
24400 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24410 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
24420 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
24430 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
24440 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
24450 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
24460 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
24470 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
24480 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
24490 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
244a0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
244b0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
244c0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
244d0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
244e0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
244f0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
24500 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
24510 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
24520 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
24530 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
24540 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
24550 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
24560 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
24570 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
24580 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
24590 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
245a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
245b0 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
245c0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
245d0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
245e0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
245f0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
24600 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
24610 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
24620 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
24630 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
24640 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
24650 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
24660 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
24670 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
24680 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
24690 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
246a0 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
246b0 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
246c0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
246d0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
246e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
246f0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
24700 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
24710 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
24720 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
24730 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
24740 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
24750 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
24760 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
24770 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
24780 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
24790 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
247a0 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
247b0 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
247c0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
247d0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
247e0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
247f0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
24800 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
24810 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
24820 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
24830 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
24840 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
24850 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
24860 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
24870 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
24880 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
24890 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
248a0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
248b0 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
248c0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
248d0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
248e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
248f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24900 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
24910 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
24920 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
24930 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
24940 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
24950 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
24960 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24970 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
24980 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
24990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
249b0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
249c0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
249f0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
24a00 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
24a30 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
24a40 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
24a50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24a60 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
24a70 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
24a80 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
24a90 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
24aa0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
24ad0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
24ae0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24af0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
24b00 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
24b10 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
24b20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24b30 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
24b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24b50 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
24b60 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
24b70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24b80 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
24b90 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
24ba0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
24bb0 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
24bc0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
24bd0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
24be0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
24bf0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
24c00 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
24c10 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
24c20 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
24c30 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
24c40 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
24c50 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
24c60 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
24c70 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
24c80 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
24c90 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
24ca0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
24cb0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
24cc0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
24cd0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
24ce0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
24cf0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24d00 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
24d10 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
24d20 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
24d30 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
24d40 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24d50 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
24d60 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
24d70 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
24d80 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
24d90 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
24da0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
24db0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
24dc0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
24dd0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
24de0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24df0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
24e00 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
24e10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
24e20 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
24e30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
24e40 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24e50 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
24e60 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
24e70 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
24e80 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
24e90 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
24ea0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
24eb0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
24ec0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
24ed0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24ee0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
24ef0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
24f00 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
24f10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
24f20 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
24f30 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
24f40 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
24f50 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
24f60 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
24f70 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
24f80 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
24f90 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
24fa0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
24fb0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
24fc0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
24fd0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
24fe0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
24ff0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
25000 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
25010 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
25020 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
25030 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
25040 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
25050 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
25060 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
25070 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
25080 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
25090 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
250a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
250b0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
250c0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
250d0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
250e0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
250f0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
25100 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
25110 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
25120 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
25130 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
25140 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25150 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
25160 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
25170 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
25180 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25190 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
251a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
251b0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
251c0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
251d0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
251e0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
251f0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
25200 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
25210 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
25220 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
25230 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
25240 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
25250 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
25290 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
252c0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
252d0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
252e0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25310 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
25320 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
25330 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
25340 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
25350 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25360 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
25370 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
25380 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
253b0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
253c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
253d0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
253e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
253f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25400 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
25410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
25420 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
25430 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
25440 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
25450 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
25460 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
25470 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
25480 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
25490 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
254a0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
254b0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
254c0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
254d0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
254e0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
254f0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
25500 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
25510 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
25520 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
25530 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
25540 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
25550 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
25560 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
25570 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
25580 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
25590 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
255a0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
255b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
255c0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
255d0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
255e0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
255f0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
25600 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
25610 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
25620 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
25630 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
25640 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
25650 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
25660 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
25670 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
25680 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
25690 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
256a0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
256b0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
256c0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
256d0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
256e0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
256f0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
25700 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
25710 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
25720 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
25730 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
25740 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
25750 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
25760 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
25770 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
25780 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
25790 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46 49  sor, BTCURSOR_FI
257a0 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a  RST_UNINIT));.}.
257b0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
257c0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
257d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
257e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
257f0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
25800 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
25810 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
25820 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
25830 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
25840 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
25850 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
25860 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
25870 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74  pBtree ){.    Bt
25880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
25890 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
258a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
258b0 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
258c0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
258d0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
258e0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
258f0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
25900 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
25910 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
25920 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
25930 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
25940 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
25950 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
25960 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
25970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
25980 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
25990 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
259a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
259b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
259c0 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
259d0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
259e0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
259f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
25a00 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
25a10 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
25a20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
25a30 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
25a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25a50 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
25a60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25a70 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
25a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25a90 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
25aa0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 30  pCur->pBtree = 0
25ab0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
25ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25ad0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
25ae0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
25af0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
25b00 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
25b10 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
25b20 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
25b30 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
25b40 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
25b50 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
25b60 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
25b70 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
25b80 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
25b90 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
25ba0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
25bb0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
25bc0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
25bd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
25be0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
25bf0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66  seCell()..*/.#if
25c00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
25c10 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66  atic int cellInf
25c20 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20  oEqual(CellInfo 
25c30 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29  *a, CellInfo *b)
25c40 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65  {.    if( a->nKe
25c50 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74  y!=b->nKey ) ret
25c60 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25c70 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70  ->pPayload!=b->p
25c80 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e  Payload ) return
25c90 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e   0;.    if( a->n
25ca0 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79  Payload!=b->nPay
25cb0 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
25cc0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63  .    if( a->nLoc
25cd0 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20  al!=b->nLocal ) 
25ce0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
25cf0 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e  ( a->nSize!=b->n
25d00 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Size ) return 0;
25d10 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
25d20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
25d30 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
25d40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25d50 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
25d60 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
25d70 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
25d80 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
25d90 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
25da0 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  >pPage, pCur->ix
25db0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
25dc0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
25dd0 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61   || cellInfoEqua
25de0 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  l(&info, &pCur->
25df0 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c  info) );.  }.#el
25e00 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
25e10 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
25e20 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
25e30 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
25e40 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
25e50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25e60 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
25e70 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
25e80 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25e90 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
25ea0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
25eb0 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
25ec0 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d  ,pCur->ix,&pCur-
25ed0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
25ee0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
25ef0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
25f00 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
25f10 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
25f20 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
25f30 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
25f40 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
25f50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
25f60 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
25f70 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
25f80 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
25f90 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
25fa0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
25fb0 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
25fc0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
25fd0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
25fe0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
25ff0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
26000 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
26010 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
26020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26030 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
26040 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
26050 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
26060 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
26070 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
26080 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
26090 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
260a0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
260b0 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
260c0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
260d0 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
260e0 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
260f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
26100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26110 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
26120 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
26130 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
26140 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
26150 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
26160 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
26170 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
26180 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
26190 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
261a0 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
261b0 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
261c0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
261d0 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
261e0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
261f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26200 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
26210 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
26220 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
26230 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
26240 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26250 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26260 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
26270 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26280 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
26290 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
262a0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
262b0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
262c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
262d0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
262e0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
262f0 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  _SQL_FUNC./*.** 
26300 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
26310 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
26320 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
26330 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
26340 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69 63   payload to whic
26350 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
26360 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34  pointing..*/.i64
26370 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66   sqlite3BtreeOff
26380 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  set(BtCursor *pC
26390 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
263a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
263b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
263c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
263d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
263e0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
263f0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cur);.  return (
26400 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70  i64)pCur->pBt->p
26410 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70 43  ageSize*((i64)pC
26420 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ur->pPage->pgno 
26430 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20 20  - 1) +.         
26440 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f  (i64)(pCur->info
26450 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75 72  .pPayload - pCur
26460 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  ->pPage->aData);
26470 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
26480 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
26490 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f  T_SQL_FUNC */../
264a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
264b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
264c0 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
264d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
264e0 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
264f0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
26500 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
26510 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
26520 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
26530 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
26540 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
26550 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
26560 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
26570 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
26580 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
26590 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
265a0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
265b0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
265c0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
265d0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
265e0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
265f0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
26600 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
26610 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
26620 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
26630 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
26640 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
26650 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
26660 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26670 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26690 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
266a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
266b0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
266c0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
266d0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
266e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
266f0 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e  n upper bound on
26700 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 79   the size of any
26710 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
26720 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20 74 68  table.** that th
26730 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
26740 74 69 6e 67 20 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a  ting into..**.**
26750 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
26760 6d 69 7a 61 74 69 6f 6e 2e 20 20 45 76 65 72 79  mization.  Every
26770 74 68 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c  thing will still
26780 20 77 6f 72 6b 20 69 66 20 74 68 69 73 0a 2a 2a   work if this.**
26790 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
267a0 72 65 74 75 72 6e 73 20 32 31 34 37 34 38 33 36  returns 21474836
267b0 34 37 20 28 77 68 69 63 68 20 69 73 20 74 68 65  47 (which is the
267c0 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72 64 0a   largest record.
267d0 2a 2a 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  ** that SQLite c
267e0 61 6e 20 68 61 6e 64 6c 65 29 20 6f 72 20 6d 6f  an handle) or mo
267f0 72 65 2e 20 20 42 75 74 20 72 65 74 75 72 6e 69  re.  But returni
26800 6e 67 20 61 20 73 6d 61 6c 6c 65 72 20 76 61 6c  ng a smaller val
26810 75 65 20 6d 69 67 68 74 0a 2a 2a 20 70 72 65 76  ue might.** prev
26820 65 6e 74 20 6c 61 72 67 65 20 6d 65 6d 6f 72 79  ent large memory
26830 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 68 65   allocations whe
26840 6e 20 74 72 79 69 6e 67 20 74 6f 20 69 6e 74 65  n trying to inte
26850 72 70 72 65 74 20 61 0a 2a 2a 20 63 6f 72 72 75  rpret a.** corru
26860 70 74 20 64 61 74 72 61 62 61 73 65 2e 0a 2a 2a  pt datrabase..**
26870 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
26880 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
26890 65 72 65 6c 79 20 72 65 74 75 72 6e 73 20 74 68  erely returns th
268a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e  e size of the un
268b0 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 64 61 74 61  derlying.** data
268c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 71  base file..*/.sq
268d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
268e0 74 65 33 42 74 72 65 65 4d 61 78 52 65 63 6f 72  te3BtreeMaxRecor
268f0 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  dSize(BtCursor *
26900 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
26910 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
26920 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
26930 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
26940 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26950 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
26960 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
26970 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
26980 29 70 43 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67  )pCur->pBt->nPag
26990 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  e;.}../*.** Give
269a0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
269b0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
269c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
269d0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
269e0 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
269f0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
26a00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
26a10 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
26a20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
26a30 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
26a40 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
26a50 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
26a60 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
26a70 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
26a80 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
26a90 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
26aa0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
26ab0 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
26ac0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
26ad0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
26ae0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26af0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
26b00 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
26b10 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
26b20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26b30 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
26b40 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
26b50 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
26b60 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
26b70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
26b80 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
26b90 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
26ba0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
26bb0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
26bc0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
26bd0 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
26be0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
26bf0 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
26c00 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
26c10 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
26c20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
26c30 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
26c40 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
26c50 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
26c60 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
26c70 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
26c80 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
26c90 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
26ca0 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
26cb0 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
26cc0 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
26cd0 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
26ce0 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
26cf0 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
26d00 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
26d10 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
26d20 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
26d30 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
26d40 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
26d50 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
26d60 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
26d70 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
26d80 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
26d90 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
26da0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
26db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
26dc0 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
26dd0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26de0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
26df0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26e00 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
26e10 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
26e20 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
26e30 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
26e40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
26e50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
26e60 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
26e70 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
26e80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
26e90 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
26ea0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
26eb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
26ec0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
26ed0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
26ee0 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
26ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26f00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
26f10 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
26f20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
26f30 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
26f40 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
26f50 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
26f60 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
26f70 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
26f80 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
26f90 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
26fa0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
26fb0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
26fc0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
26fd0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
26fe0 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
26ff0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
27000 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
27010 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
27020 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
27030 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
27040 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
27050 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
27060 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
27070 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
27080 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
27090 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
270a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
270b0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
270c0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
270d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
270e0 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
270f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
27100 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
27110 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
27120 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
27130 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
27140 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
27150 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27160 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
27170 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
27180 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
27190 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
271a0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
271b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
271c0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
271d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
271e0 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
271f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
27200 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
27210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27220 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
27230 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
27240 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
27250 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
27260 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
27270 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27280 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
27290 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
272a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
272b0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
272c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
272d0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
272e0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
272f0 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
27300 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
27310 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
27320 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
27330 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
27340 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
27350 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
27360 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
27370 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
27380 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
27390 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
273a0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
273b0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
273c0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
273d0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
273e0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
273f0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
27400 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
27410 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
27420 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
27430 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
27440 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
27450 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
27460 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
27470 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
27480 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
27490 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
274a0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
274b0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
274c0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
274d0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
274e0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
274f0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
27500 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27510 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
27520 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
27530 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
27540 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
27550 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
27560 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
27570 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
27580 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
27590 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
275a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
275b0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
275c0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
275d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
275e0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
275f0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
27600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27610 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
27620 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
27630 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
27640 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
27650 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
27660 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
27670 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
27680 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
27690 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
276a0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
276b0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
276c0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
276d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
276e0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
276f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
27710 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27720 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
27730 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
27740 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
27750 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
27760 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
27770 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
27780 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
27790 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
277a0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
277b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
277c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
277d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
277e0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
277f0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
27800 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
27810 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
27820 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
27830 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
27840 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
27850 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
27860 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
27870 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
27880 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
27890 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
278a0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
278b0 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
278c0 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
278d0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
278e0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
278f0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
27900 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
27910 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
27920 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
27930 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
27940 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
27950 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
27960 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
27970 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
27980 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
27990 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
279a0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
279b0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
279c0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
279d0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
279e0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
279f0 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
27a00 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
27a10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a  verflow pages.**
27a20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
27a30 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ay allocate spac
27a40 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
27a50 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65   populate.** the
27a60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
27a70 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
27a80 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
27a90 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
27aa0 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
27ab0 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
27ac0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
27ad0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
27ae0 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
27af0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
27b00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27b10 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
27b20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
27b30 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  it must be.** in
27b40 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
27b50 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
27b60 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
27b70 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
27b80 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
27b90 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
27ba0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
27bb0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
27bc0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
27bd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
27be0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
27bf0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
27c00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
27c10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
27c20 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
27c30 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
27c40 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
27c50 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
27c60 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
27c70 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
27c80 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
27c90 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
27ca0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
27cb0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
27cc0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
27cd0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
27ce0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
27cf0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
27d00 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
27d10 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
27d20 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
27d30 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
27d40 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
27d50 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
27d60 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
27d70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27d80 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
27d90 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
27da0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
27db0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
27dc0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
27dd0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
27de0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
27df0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27e00 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
27e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27e20 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
27e30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27e40 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e60 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
27e70 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
27e80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27e90 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27eb0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
27ec0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
27ed0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
27ee0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27ef0 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
27f00 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
27f10 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20  fStart = pBuf;  
27f20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f     /* Start of o
27f30 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66  riginal out buff
27f40 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
27f50 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
27f60 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
27f70 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20  0 || eOp==1 );. 
27f80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27f90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27fa0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27fb0 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
27fc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
27fd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27fe0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
27ff0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
28000 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
28010 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
28020 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20  load;.  assert( 
28030 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
28040 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
28050 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d );..  assert( 
28060 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65  aPayload > pPage
28070 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28  ->aData );.  if(
28080 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64   (uptr)(aPayload
28090 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29   - pPage->aData)
280a0 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   > (pBt->usableS
280b0 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize - pCur->info
280c0 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  .nLocal) ){.    
280d0 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
280e0 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
280f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
28100 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ata is an error.
28110 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e    The.    ** con
28120 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69  ditional above i
28130 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a  s really:.    **
28140 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43      &aPayload[pC
28150 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
28160 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
28170 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
28180 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20  ].    ** but is 
28190 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20  recast into its 
281a0 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20  current form to 
281b0 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76  avoid integer ov
281c0 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a  erflow problems.
281d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
281e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
281f0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
28200 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
28210 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
28220 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
28230 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
28240 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
28250 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
28260 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
28270 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
28280 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
28290 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
282a0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
282b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
282c0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
282d0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
282e0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
282f0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
28300 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
28310 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
28320 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
28330 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
28340 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
28350 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
28360 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
28370 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d    }...  if( rc==
28380 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
28390 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
283a0 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
283b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
283c0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
283d0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
283e0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
283f0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
28400 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28410 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
28420 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
28430 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28440 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
28450 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
28460 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
28470 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
28480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
28490 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
284a0 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f  ay is sized at o
284b0 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
284c0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  h overflow page.
284d0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76      ** in the ov
284e0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
284f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
28500 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
28510 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20  low page is.    
28520 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  ** stored in aOv
28530 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20  erflow[0], etc. 
28540 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
28550 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
28560 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61  array.    ** mea
28570 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
28580 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73  n" (the cache is
28590 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
285a0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
285b0 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
285c0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
285d0 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
285e0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
285f0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
28600 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
28610 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
28620 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
28630 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
28640 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  low==0.       ||
28650 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a 65   nOvfl*(int)size
28660 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69 74  of(Pgno) > sqlit
28670 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43 75  e3MallocSize(pCu
28680 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20 20  r->aOverflow).  
28690 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50      ){.        P
286a0 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
286b0 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
286c0 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
286d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
286e0 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
286f0 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
28700 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
28710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
28720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28730 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
28740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28750 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
28760 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  low = aNew;.    
28770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28780 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
28790 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
287a0 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
287b0 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ));.      pCur->
287c0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
287d0 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
287e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
287f0 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
28800 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
28810 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
28820 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  ed and the.     
28830 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
28840 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
28850 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
28860 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
28870 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
28880 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  to it..      */.
28890 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
288a0 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
288b0 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
288c0 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
288d0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
288e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
288f0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
28900 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
28910 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
28920 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
28930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28940 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28950 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
28960 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 65  );.    while( ne
28970 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  xtPage ){.      
28980 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
28990 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
289a0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
289b0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
289c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f  assert( pCur->aO
289d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30  verflow[iIdx]==0
289e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
289f0 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
28a00 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
28a10 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28a20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
28a30 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
28a40 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
28a50 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  extPage;..      
28a60 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
28a70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
28a80 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
28a90 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
28aa0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
28ab0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
28ac0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
28ad0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
28ae0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
28af0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
28b00 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
28b10 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
28b20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
28b30 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
28b40 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
28b50 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
28b60 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
28b70 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
28b80 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
28b90 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
28ba0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
28bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28bc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
28bd0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20   BTCF_ValidOvfl 
28be0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28bf0 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  t( pCur->pBtree-
28c00 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a  >db==pBt->db );.
28c10 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
28c20 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
28c30 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
28c40 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
28c50 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
28c60 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
28c70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
28c80 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
28c90 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
28ca0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
28cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28cc0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
28cd0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
28ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
28cf0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
28d00 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
28d10 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
28d20 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
28d30 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
28d40 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
28d50 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
28d60 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
28d70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28d80 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
28d90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
28da0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
28db0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
28dc0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
28dd0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
28de0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
28df0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
28e00 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
28e10 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
28e20 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
28e30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28e40 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
28e50 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
28e60 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
28e70 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
28e80 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
28e90 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
28ea0 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
28eb0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
28ec0 20 20 33 29 20 74 68 65 72 65 20 61 72 65 20 6e    3) there are n
28ed0 6f 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  o dirty pages in
28ee0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 0a   the page-cache.
28ef0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
28f00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
28f10 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
28f20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
28f30 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
28f40 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   in the WAL file
28f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
28f60 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
28f70 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
28f80 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
28f90 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
28fa0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28fb0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
28fc0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
28fd0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
28fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
28ff0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
29000 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
29010 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
29020 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
29030 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
29040 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
29050 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
29060 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
29070 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
29080 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
29090 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
290a0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290d0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
290e0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
29120 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
29130 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
29140 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61 67 65  eadOk(pBt->pPage
29150 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20  r, nextPage)    
29160 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a 20 20  /* (3,4,5) */.  
29170 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
29180 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291b0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
291c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
291d0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 73  te3_file *fd = s
291e0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
291f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
29200 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
29210 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
29220 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
29230 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
29240 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
29250 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20        /* due to 
29280 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
29290 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
292a0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
292b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
292c0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
292d0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
292e0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
292f0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
29300 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
29310 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
29320 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
29330 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
29340 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
29350 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
29360 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
29370 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
29380 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29390 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
293a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
293b0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
293c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
293d0 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  eOp==0 ? PAGER_G
293e0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
293f0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
29400 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29420 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
29430 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
29440 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
29450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
29460 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
29470 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
29480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
29490 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
294a0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
294b0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
294c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
294d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
294e0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
294f0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
29500 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
29510 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29520 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
29530 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d         if( amt==
29540 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
29550 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
29560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29570 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
29580 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20        iIdx++;.  
29590 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
295a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
295b0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  amt>0 ){.    /* 
295c0 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
295d0 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
295e0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
295f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
29600 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
29610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29620 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
29630 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
29640 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
29650 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
29660 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
29670 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
29680 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
29690 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
296a0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
296b0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
296c0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
296d0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
296e0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
296f0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
29700 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
29710 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
29720 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
29730 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
29740 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
29750 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
29760 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
29770 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
29780 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
29790 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
297a0 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
297b0 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
297c0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
297d0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
297e0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
297f0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
29800 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
29810 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29820 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
29830 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
29840 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
29850 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
29860 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
29870 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
29880 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
29890 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
298a0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
298b0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
298c0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
298d0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
298e0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
298f0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
29900 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
29910 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
29920 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
29930 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
29940 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
29950 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
29960 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
29970 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29980 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29990 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
299a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
299b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
299c0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
299d0 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
299e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
299f0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
29a00 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
29a10 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29a20 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29a30 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
29a40 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
29a50 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
29a60 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
29a70 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
29a80 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
29a90 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
29aa0 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
29ab0 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
29ac0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
29ad0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
29ae0 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
29af0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
29b00 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
29b10 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
29b20 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
29b30 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
29b40 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
29b50 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
29b60 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
29b70 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
29b80 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
29b90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29ba0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
29bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29bc0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
29bd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29be0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29bf0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
29c00 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
29c10 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
29c20 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
29c30 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29c40 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29c50 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
29c60 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29c70 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
29c80 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
29c90 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
29ca0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
29cb0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29cc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
29cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
29ce0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29cf0 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
29d00 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
29d10 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
29d20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
29d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29d40 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
29d50 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
29d60 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
29d70 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
29d80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
29d90 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
29da0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
29db0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
29dc0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
29dd0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
29de0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
29df0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
29e00 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
29e10 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
29e20 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
29e30 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
29e40 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
29e50 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
29e60 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
29e70 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
29e80 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
29e90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
29ea0 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
29eb0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
29ec0 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
29ed0 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
29ee0 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
29ef0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
29f00 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
29f10 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
29f20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
29f30 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
29f40 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
29f50 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
29f60 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
29f70 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
29f80 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
29f90 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
29fa0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
29fb0 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
29fc0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
29fd0 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
29fe0 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
29ff0 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
2a000 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
2a010 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
2a020 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
2a030 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2a040 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
2a050 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
2a060 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
2a070 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
2a080 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
2a090 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
2a0a0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
2a0b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
2a0c0 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
2a0d0 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
2a0e0 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
2a0f0 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
2a100 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
2a110 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
2a120 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
2a130 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
2a140 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
2a150 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
2a160 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
2a170 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
2a180 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2a190 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
2a1a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
2a1b0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
2a1c0 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
2a1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2a1e0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2a1f0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2a200 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a210 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
2a220 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
2a230 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
2a240 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73  r->pPage);.  ass
2a250 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a260 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a280 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a290 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2a2a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2a2b0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a2c0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a2e0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2a2f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2a300 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2a310 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
2a320 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2a330 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70  pPayload>pCur->p
2a340 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43  Page->aData || C
2a350 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
2a360 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a370 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d  o.pPayload<pCur-
2a380 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2a390 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
2a3a0 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e    amt = pCur->in
2a3b0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28  fo.nLocal;.  if(
2a3c0 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d   amt>(int)(pCur-
2a3d0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
2a3e0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
2a3f0 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f  ayload) ){.    /
2a400 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c  * There is too l
2a410 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74  ittle space on t
2a420 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  he page for the 
2a430 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a  expected amount.
2a440 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20      ** of local 
2a450 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73  content. Databas
2a460 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2a470 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
2a480 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  ( CORRUPT_DB );.
2a490 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c      amt = MAX(0,
2a4a0 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61   (int)(pCur->pPa
2a4b0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
2a4c0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
2a4d0 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ad));.  }.  *pAm
2a4e0 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20  t = (u32)amt;.  
2a4f0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43  return (void*)pC
2a500 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a510 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
2a520 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
2a530 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
2a540 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
2a550 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
2a560 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
2a570 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
2a580 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
2a590 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
2a5a0 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
2a5b0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
2a5c0 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
2a5d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
2a5e0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
2a5f0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
2a600 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
2a610 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
2a620 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
2a630 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
2a640 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
2a650 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
2a660 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
2a670 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
2a680 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
2a690 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
2a6a0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
2a6b0 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
2a6c0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
2a6d0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
2a6e0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
2a6f0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
2a700 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
2a710 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
2a720 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
2a730 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
2a740 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2a750 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
2a760 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
2a770 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42  eePayloadFetch(B
2a780 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
2a790 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
2a7a0 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
2a7b0 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
2a7c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2a7d0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
2a7e0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2a7f0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
2a800 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
2a810 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
2a820 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2a830 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
2a840 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a850 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
2a860 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
2a870 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2a880 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
2a890 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
2a8a0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
2a8b0 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
2a8c0 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
2a8d0 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
2a8e0 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
2a8f0 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
2a900 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
2a910 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
2a920 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
2a930 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
2a940 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
2a950 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
2a960 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a970 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
2a980 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a990 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a9a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a9b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a9c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2a9d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
2a9e0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
2a9f0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
2aa00 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
2aa10 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2aa20 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
2aa30 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
2aa40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2aa50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2aa60 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e  ;.  }.  pCur->in
2aa70 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2aa80 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2aa90 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2aaa0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2aab0 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  l);.  pCur->aiId
2aac0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2aad0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
2aae0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2aaf0 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70  iPage] = pCur->p
2ab00 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78  Page;.  pCur->ix
2ab10 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
2ab20 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  age++;.  return 
2ab30 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2ab40 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
2ab50 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c  ur->pPage, pCur,
2ab60 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
2ab70 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  lags);.}..#ifdef
2ab80 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2ab90 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
2aba0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
2abb0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
2abc0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
2abd0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
2abe0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
2abf0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
2ac00 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
2ac10 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
2ac20 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
2ac30 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
2ac40 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
2ac50 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
2ac60 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
2ac70 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
2ac80 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
2ac90 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
2aca0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
2acb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2acc0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
2acd0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2ace0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
2acf0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
2ad00 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
2ad10 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
2ad20 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
2ad30 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
2ad40 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
2ad70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
2ad80 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
2ad90 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
2ada0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
2adb0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2adc0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2add0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2ade0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2adf0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
2ae00 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
2ae10 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
2ae20 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
2ae30 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
2ae40 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
2ae50 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
2ae60 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
2ae70 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
2ae80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2ae90 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
2aea0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
2aeb0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
2aec0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
2aed0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
2aee0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
2aef0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
2af00 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
2af10 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
2af20 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
2af30 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2af40 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
2af50 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
2af60 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
2af70 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
2af80 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
2af90 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
2afa0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
2afb0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2afc0 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28  pLeaf;.  assert(
2afd0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2afe0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2aff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b000 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b010 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2b020 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
2b030 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b040 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
2b050 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
2b060 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2b070 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
2b080 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b090 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2b0a0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
2b0b0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
2b0c0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
2b0d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2b0e0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
2b0f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2b100 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
2b110 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2b120 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2b130 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2b140 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2b150 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
2b160 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
2b170 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2b180 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72  ;.  pLeaf = pCur
2b190 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2b1a0 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
2b1b0 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50  pPage[--pCur->iP
2b1c0 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  age];.  releaseP
2b1d0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66  ageNotNull(pLeaf
2b1e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
2b1f0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
2b200 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
2b210 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
2b220 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
2b230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
2b240 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
2b250 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
2b260 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
2b270 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
2b280 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
2b290 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
2b2a0 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
2b2b0 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
2b2c0 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
2b2d0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
2b2e0 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
2b2f0 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
2b300 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
2b310 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
2b320 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
2b330 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
2b340 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2b350 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
2b360 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
2b370 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
2b380 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
2b390 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
2b3a0 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
2b3b0 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  D and this routi
2b3c0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2b3d0 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69  E_EMPTY. Otherwi
2b3e0 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f  se,.** the curso
2b3f0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
2b400 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  t to the first c
2b410 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
2b420 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76  he root.** (or v
2b430 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
2b440 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
2b450 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2b460 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
2b470 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
2b480 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
2b490 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
2b4a0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
2b4b0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
2b4c0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
2b4d0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
2b4e0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
2b4f0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
2b500 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
2b510 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
2b520 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
2b530 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
2b540 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
2b550 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2b560 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
2b570 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
2b580 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
2b590 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
2b5a0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
2b5b0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
2b5c0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
2b5d0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
2b5e0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2b5f0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2b600 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
2b610 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
2b620 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
2b630 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
2b640 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
2b650 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2b660 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
2b670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b680 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b690 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2b6a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2b6b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
2b6c0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
2b6d0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2b6e0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
2b6f0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2b700 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2b710 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
2b720 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
2b730 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2b740 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b750 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2b760 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69  ESEEK || pCur->i
2b770 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65  Page<0 );.  asse
2b780 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2b790 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  ot>0 || pCur->iP
2b7a0 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20  age<0 );..  if( 
2b7b0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
2b7c0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2b7d0 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72  iPage ){.      r
2b7e0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2b7f0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  l(pCur->pPage);.
2b800 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70        while( --p
2b810 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
2b820 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b830 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
2b840 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b850 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e]);.      }.   
2b860 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
2b870 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2b880 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
2b890 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
2b8a0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
2b8b0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
2b8c0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b8d0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2b8e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b8f0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c  ITE_EMPTY;.  }el
2b900 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
2b910 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
2b920 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ) );.    if( pCu
2b930 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
2b940 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
2b950 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2b960 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b970 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20  FAULT ){.       
2b980 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2b990 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
2b9a0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  OK );.        re
2b9b0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
2b9c0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
2b9d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
2b9e0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
2b9f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2ba00 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2ba10 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
2ba20 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2ba30 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c  t, &pCur->pPage,
2ba40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ba50 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
2ba60 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2ba70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ba80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ba90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2baa0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bac0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2bad0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
2bae0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2baf0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  = pCur->pPage->i
2bb00 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f  ntKey;.  }.  pRo
2bb10 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2bb20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
2bb30 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
2bb40 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
2bb50 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
2bb60 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
2bb70 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
2bb80 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
2bb90 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
2bba0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
2bbb0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
2bbc0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
2bbd0 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
2bbe0 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
2bbf0 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
2bc00 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
2bc10 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2bc20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
2bc30 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
2bc40 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
2bc50 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
2bc60 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2bc70 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2bc80 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
2bc90 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
2bca0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
2bcb0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
2bcc0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2bcd0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
2bce0 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
2bcf0 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
2bd00 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
2bd10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2bd20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
2bd30 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
2bd40 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
2bd50 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
2bd60 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
2bd70 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
2bd80 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
2bd90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
2bda0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
2bdb0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2bdc0 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
2bdd0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
2bde0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2bdf0 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
2be00 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2be10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
2be20 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29  AGE(pCur->pPage)
2be30 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74  ;.  }..skip_init
2be40 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  :  .  pCur->ix =
2be50 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
2be60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2be70 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2be80 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2be90 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2bea0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
2beb0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2bec0 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f  Page;.  if( pRoo
2bed0 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
2bee0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bef0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2bf00 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
2bf10 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
2bf20 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
2bf30 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
2bf40 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
2bf50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2bf60 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
2bf70 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
2bf80 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
2bf90 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2bfa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bfb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2bfc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2bfd0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
2bfe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2bff0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2c000 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2c010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2c020 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MPTY;.  }.  retu
2c030 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c040 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c050 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
2c060 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2c070 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2c080 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
2c090 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2c0a0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
2c0b0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
2c0c0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
2c0d0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
2c0e0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
2c0f0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
2c100 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2c110 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2c120 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2c130 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2c140 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c150 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2c160 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2c170 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c180 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c1a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c1b0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2c1c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c1d0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2c1e0 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2c1f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2c200 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43  ur->ix<pPage->nC
2c210 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
2c220 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c230 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2c240 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >ix));.    rc = 
2c250 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c260 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
2c270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c280 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2c290 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
2c2a0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
2c2b0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2c2c0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
2c2d0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2c2e0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
2c2f0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
2c300 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
2c310 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
2c320 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
2c330 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
2c340 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
2c350 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
2c360 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2c370 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
2c380 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c390 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2c3a0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2c3b0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
2c3c0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
2c3d0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2c3e0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2c3f0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2c400 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
2c410 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
2c420 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
2c430 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
2c440 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2c450 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2c460 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c470 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2c480 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
2c490 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2c4a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2c4b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2c4c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2c4d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
2c4e0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
2c4f0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2c500 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2c510 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2c520 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2c530 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2c540 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2c550 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2c560 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2c570 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2c580 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2c590 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2c5a0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2c5b0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2c5c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2c5d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2c5e0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2c5f0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2c600 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2c610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c620 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2c630 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2c640 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c650 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2c660 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2c670 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2c680 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2c690 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2c6a0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2c6b0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2c6c0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2c6d0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2c6e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2c6f0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2c700 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c710 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2c720 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2c730 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2c740 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2c750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c760 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2c770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2c780 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2c790 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2c7a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2c7b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2c7c0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2c7d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c7e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
2c7f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2c800 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2c810 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2c820 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c830 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2c840 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c850 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2c860 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2c870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2c880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c890 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2c8a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
2c8b0 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65 73  cursor pCur does
2c8c0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20   not point to a 
2c8d0 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74  valid row..** Ot
2c8e0 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72  herwise, if pCur
2c8f0 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69   is valid, confi
2c900 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74 20  gure it so that 
2c910 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
2c920 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
2c930 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Next() is a no-o
2c940 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  p..*/.#ifndef SQ
2c950 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2c960 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74 65  FUNC.void sqlite
2c970 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28 42  3BtreeSkipNext(B
2c980 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2c990 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65 20    /* We believe 
2c9a0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2c9b0 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 69  must always be i
2c9c0 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61 74  n the valid stat
2c9d0 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69 73  e when.  ** this
2c9e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2c9f0 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f 6f  ed, but the proo
2ca00 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c 20  f is difficult, 
2ca10 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20 2a  so we add an.  *
2ca20 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74 20  * ALWaYS() test 
2ca30 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65 20  just in case we 
2ca40 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20 20  are wrong. */.  
2ca50 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d  if( ALWAYS(pCur-
2ca60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ca70 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 43  VALID) ){.    pC
2ca80 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2ca90 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
2caa0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2cab0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 1;.  }.}.#end
2cac0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2cad0 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
2cae0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2caf0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
2cb00 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2cb10 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2cb20 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2cb30 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2cb40 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2cb50 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2cb60 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2cb70 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2cb80 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2cb90 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2cba0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2cbb0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2cbc0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2cbd0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2cbe0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2cbf0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2cc00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2cc10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2cc20 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2cc30 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2cc40 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2cc50 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2cc60 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2cc70 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2cc80 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2cc90 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2cca0 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2ccb0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ccc0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2ccd0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2cce0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2ccf0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2cd00 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2cd10 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2cd20 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2cd30 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2cd40 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2cd50 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2cd60 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2cd70 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2cd80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2cd90 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2cda0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2cdb0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2cdc0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2cdd0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==pCur
2cde0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  ->pPage->nCell-1
2cdf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ce00 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
2ce10 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2ce20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ce30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2ce40 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2ce50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ce60 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2ce70 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ce80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ce90 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2cea0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2ceb0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2cec0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ced0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2cee0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2cef0 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
2cf00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2cf10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2cf20 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2cf30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2cf40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2cf50 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
2cf60 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2cf70 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2cf80 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2cf90 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2cfa0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2cfb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cfc0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2cfd0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
2cfe0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
2cff0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
2d000 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
2d010 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
2d020 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
2d030 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
2d040 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
2d050 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
2d060 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
2d070 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
2d080 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
2d090 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
2d0a0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
2d0b0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
2d0c0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
2d0d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
2d0e0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
2d0f0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
2d100 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
2d110 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
2d120 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
2d130 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
2d140 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
2d150 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
2d160 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
2d170 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
2d180 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
2d190 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
2d1a0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
2d1b0 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
2d1c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2d1d0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
2d1e0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
2d1f0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
2d200 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
2d210 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
2d220 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
2d230 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
2d240 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2d250 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2d260 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
2d270 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
2d280 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
2d290 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2d2a0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2d2b0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2d2d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
2d2e0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
2d2f0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2d300 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
2d310 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
2d320 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
2d330 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
2d340 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
2d350 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
2d360 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2d370 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2d380 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2d390 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2d3a0 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
2d3b0 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
2d3c0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
2d3d0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
2d3e0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2d3f0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2d400 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2d410 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
2d420 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
2d430 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2d440 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2d450 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e  s, the pIdxKey->
2d460 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20  eqSeen field is 
2d470 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72  set to 1 if ther
2d480 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65  e.** exists an e
2d490 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2d4a0 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d  e that exactly m
2d4b0 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20  atches pIdxKey. 
2d4c0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2d4d0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
2d4e0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2d4f0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2d500 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2d510 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2d520 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2d530 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2d540 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2d550 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2d560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d570 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2d580 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2d590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2d5a0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2d5b0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2d5c0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2d5d0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2d5e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2d5f0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2d600 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2d610 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2d620 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2d630 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d640 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d650 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d660 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d670 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2d680 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2d690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2d6a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2d6b0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2d6c0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
2d6d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d6e0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d6f0 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78  R_VALID || (pIdx
2d700 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2d710 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b  curIntKey!=0) );
2d720 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2d730 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2d740 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
2d750 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
2d760 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
2d770 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
2d780 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
2d790 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
2d7a0 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d  /.  if( pIdxKey=
2d7b0 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65  =0.   && pCur->e
2d7c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d7d0 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
2d7e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2d7f0 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b  lidNKey)!=0.  ){
2d800 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2d810 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2d820 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2d830 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2d840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d850 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2d860 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
2d870 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
2d880 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d890 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2d8a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2d8b0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  s = -1;.        
2d8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d8e0 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
2d8f0 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d  ted key is one m
2d900 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65  ore than the pre
2d910 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a  vious key, then.
2d920 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20        ** try to 
2d930 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20  get there using 
2d940 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2d950 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  () rather than a
2d960 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62   full.      ** b
2d970 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54  inary search.  T
2d980 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
2d990 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68  zation only.  Th
2d9a0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
2d9b0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2d9c0 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68  ll obtained with
2d9d0 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f  out this case, o
2d9e0 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
2d9f0 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
2da00 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2da10 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
2da20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
2da30 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
2da40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2da50 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20  Next(pCur, 0);. 
2da60 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2da70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2da80 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
2da90 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20  o(pCur);.       
2daa0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2dab0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
2dac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2dad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2daf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2db00 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2db10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2db20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2db30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2db40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2db50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2db60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2db70 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
2db80 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2db90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
2dba0 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
2dbb0 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
2dbc0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
2dbd0 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
2dbe0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
2dbf0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2dc00 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2dc10 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
2dc20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2dc30 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
2dc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
2dc50 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
2dc60 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
2dc70 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
2dc80 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2dc90 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2dca0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
2dcb0 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  c==SQLITE_EMPTY 
2dcc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2dcd0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2dce0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67  =0 || pCur->pPag
2dcf0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2dd00 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
2dd10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2dd20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2dd30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dd40 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2dd50 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2dd60 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2dd70 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2dd80 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2dd90 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2dda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ddb0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2ddc0 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74   > 0 );.  assert
2ddd0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2dde0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2ddf0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
2de00 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
2de10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2de20 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
2de30 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
2de40 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
2de50 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
2de60 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
2de70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2de80 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2de90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2dec0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2ded0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2dee0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2def0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2df00 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2df10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2df20 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2df30 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2df40 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2df50 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2df60 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2df70 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2df80 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2df90 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2dfa0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2dfb0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2dfc0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2dfd0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2dfe0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2dff0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2e000 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2e010 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2e020 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2e030 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2e040 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2e050 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2e060 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2e070 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2e080 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2e090 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2e0a0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2e0b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e0c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2e0d0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2e0e0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2e0f0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2e100 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2e110 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2e120 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2e130 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2e140 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2e150 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2e160 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2e170 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2e180 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2e190 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2e1a0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2e1b0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2e1c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2e1d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2e1e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2e1f0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2e200 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2e210 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2e220 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2e230 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2e240 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2e250 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2e260 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2e270 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
2e280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e290 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2e2a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2e2b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e2c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e2d0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
2e2e0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
2e2f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2e300 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
2e310 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
2e320 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2e330 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2e340 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
2e350 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2e360 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
2e370 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2e380 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2e390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e3a0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
2e3b0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2e3c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e3d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2e3e0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
2e3f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2e400 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2e410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2e420 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e430 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2e440 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2e450 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2e460 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2e470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e480 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2e490 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2e4a0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2e4b0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2e4c0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2e4e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
2e500 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2e510 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e520 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e530 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e540 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2e550 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2e560 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2e570 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2e580 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2e590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e5a0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
2e5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2e5c0 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  Cell;  /* Size o
2e5d0 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c  f the pCell cell
2e5e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2e5f0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2e600 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2e610 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20  ge, idx);..     
2e620 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
2e630 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
2e640 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
2e650 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
2e660 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2e670 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
2e680 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
2e690 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
2e6a0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
2e6b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
2e6c0 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
2e6d0 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
2e6e0 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
2e6f0 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
2e700 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
2e710 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
2e720 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
2e730 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
2e740 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2e750 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
2e760 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
2e770 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
2e780 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
2e790 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
2e7a0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
2e7b0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
2e7c0 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
2e7d0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
2e7e0 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
2e7f0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
2e800 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43        nCell = pC
2e810 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
2e820 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65  if( nCell<=pPage
2e830 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
2e840 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2e850 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
2e860 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
2e870 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
2e880 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
2e890 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
2e8a0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2e8b0 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
2e8c0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2e8d0 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
2e8e0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
2e8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2e900 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2e910 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
2e920 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2e930 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2e940 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2e950 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
2e960 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2e970 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
2e980 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
2e990 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
2e9a0 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
2e9b0 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
2e9c0 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
2e9d0 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
2e9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2e9f0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2ea00 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
2ea10 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2ea20 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
2ea30 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
2ea40 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
2ea50 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2ea60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ea70 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
2ea80 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2ea90 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2eaa0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2eab0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2eac0 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
2ead0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2eae0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2eaf0 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73  The record flows
2eb00 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f   over onto one o
2eb10 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
2eb20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20  pages. In.      
2eb30 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65      ** this case
2eb40 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20   the whole cell 
2eb50 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73  needs to be pars
2eb60 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c  ed, a buffer all
2eb70 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20  ocated.         
2eb80 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61   ** and accessPa
2eb90 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20  yload() used to 
2eba0 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63  retrieve the rec
2ebb0 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ord into the.   
2ebc0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
2ebd0 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f   before VdbeReco
2ebe0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20  rdCompare() can 
2ebf0 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20  be called. .    
2ec00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2ec10 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63     ** If the rec
2ec20 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ord is corrupt, 
2ec30 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  the xRecordCompa
2ec40 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  re routine may r
2ec50 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ead.          **
2ec60 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e   up to two varin
2ec70 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ts past the end 
2ec80 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41  of the buffer. A
2ec90 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20  n extra 18 .    
2eca0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f        ** bytes o
2ecb0 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c  f padding is all
2ecc0 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e  ocated at the en
2ecd0 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  d of the buffer 
2ece0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2ecf0 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e  case this happen
2ed00 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
2ed10 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
2ed20 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
2ed30 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
2ed40 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
2ed50 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
2ed60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2ed70 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
2ed80 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
2ed90 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
2eda0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
2edb0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
2edc0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  y;.          tes
2edd0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29  tcase( nCell<0 )
2ede0 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b  ;   /* True if k
2edf0 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20  ey size is 2^32 
2ee00 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20  or more */.     
2ee10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2ee20 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49  Cell==0 );  /* I
2ee30 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2ee40 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30    0x80 0x80 0x00
2ee50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2ee60 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31  stcase( nCell==1
2ee70 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2ee80 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2ee90 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20  0x80 0x01 */.   
2eea0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2eeb0 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a   nCell==2 );  /*
2eec0 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69   Minimum legal i
2eed0 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f  ndex key size */
2eee0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2eef0 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c 6c 2f  Cell<2 || nCell/
2ef00 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  pCur->pBt->usabl
2ef10 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42 74 2d  eSize>pCur->pBt-
2ef20 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
2ef30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ef40 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2ef50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ef60 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2ef70 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2ef80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2ef90 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2efa0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2efb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2efc0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2efe0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2eff0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2f000 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2f010 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2f020 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2f030 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2f040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2f050 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2f060 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2f070 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2f080 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
2f090 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2f0a0 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
2f0b0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
2f0c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f0d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2f0e0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2f0f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f100 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2f110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f120 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2f130 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2f140 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2f150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2f160 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2f170 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2f180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2f190 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2f1a0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2f1b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2f1c0 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2f1d0 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2f1e0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2f1f0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2f200 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2f210 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2f220 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2f230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2f240 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2f250 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2f260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2f270 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2f280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f290 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2f2a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2f2b0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2f2c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f2d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2f2e0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2f2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f300 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2f310 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2f320 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f330 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2f340 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2f350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2f360 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2f370 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f380 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2f390 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2f3a0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2f3b0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2f3c0 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2f3d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2f3e0 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2f3f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f400 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2f410 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f420 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2f430 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2f440 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f450 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2f460 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2f470 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20  .      pCur->ix 
2f480 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2f490 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2f4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f4b0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2f4c0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2f4d0 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2f4e0 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2f4f0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2f500 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2f510 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f520 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2f530 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2f540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f550 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2f560 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2f570 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2f580 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2f590 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2f5a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2f5b0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2f5c0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2f5d0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2f5e0 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2f5f0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
2f600 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2f610 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2f620 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72  dOvfl)==0 );.  r
2f630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f640 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2f650 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2f660 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2f670 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2f680 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2f690 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2f6a0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2f6b0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2f6c0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2f6d0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2f6e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2f6f0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2f700 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2f710 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2f720 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2f730 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2f740 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2f750 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2f760 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2f770 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2f780 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2f790 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2f7a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2f7b0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2f7c0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2f7d0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2f7e0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2f7f0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2f800 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2f810 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2f820 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2f830 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2f840 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2f850 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2f860 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2f870 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
2f880 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20  stimate for the 
2f890 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2f8a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2f8b0 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e   pCur is.** poin
2f8c0 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e  ting to.  Return
2f8d0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2f8e0 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74  er if no estimat
2f8f0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  e is currently .
2f900 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  ** available..*/
2f910 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
2f920 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43  eRowCountEst(BtC
2f930 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f940 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a  i64 n;.  u8 i;..
2f950 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f960 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f970 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f980 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f990 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2f9a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2f9b0 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2f9c0 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
2f9d0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
2f9e0 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  the OP_IfSmaller
2f9f0 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e  .  ** opcode, an
2fa00 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74  d it that case t
2fa10 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61  he cursor will a
2fa20 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61  lways be valid a
2fa30 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77  nd.  ** will alw
2fa40 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c  ays point to a l
2fa50 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  eaf node. */.  i
2fa60 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  f( NEVER(pCur->e
2fa70 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fa80 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31  LID) ) return -1
2fa90 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
2faa0 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
2fab0 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  =0) ) return -1;
2fac0 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50  ..  n = pCur->pP
2fad0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f  age->nCell;.  fo
2fae0 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69  r(i=0; i<pCur->i
2faf0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2fb00 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  n *= pCur->apPag
2fb10 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  e[i]->nCell;.  }
2fb20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
2fb30 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2fb40 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2fb50 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2fb60 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20  e database. .** 
2fb70 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a  Return value:.**
2fb80 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .**    SQLITE_OK
2fb90 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a          success.
2fba0 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  **    SQLITE_DON
2fbb0 45 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73  E      cursor is
2fbc0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2fbd0 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c  g at the last el
2fbe0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65  ement.**    othe
2fbf0 72 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d  rwise        som
2fc00 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
2fc10 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54  occurred.**.** T
2fc20 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2fc30 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2fc40 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74  reeNext().  That
2fc50 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2fc60 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2fc70 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2fc80 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74  merely increment
2fc90 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2fca0 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2fcb0 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  Idx.** to the ne
2fcc0 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  xt cell on the c
2fcd0 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2fce0 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2fcf0 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a  Next() helper.**
2fd00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2fd10 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2fd20 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2fd30 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2fd40 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73  age or.** to res
2fd50 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2fd60 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2fd70 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2fd80 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42  ment in sqlite3B
2fd90 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73  treeNext(C,F) is
2fda0 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
2fdb0 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
2fdc0 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2fdd0 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ex and this rout
2fde0 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2fdf0 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69  een.** skipped i
2fe00 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20  f the SQL index 
2fe10 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75  had been a uniqu
2fe20 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20  e index.  The F 
2fe30 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
2fe40 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
2fe50 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20  lement.  SQLite 
2fe60 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2fe70 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2fe80 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20  e.** this hint, 
2fe90 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
2fea0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2feb0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2fec0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2fed0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2fee0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2fef0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2ff00 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ff10 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2ff20 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
2ff30 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ff40 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2ff50 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2ff60 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ff70 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2ff80 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2ff90 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2ffa0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2ffb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ffc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ffd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2ffe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2fff0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
30000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30010 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
30020 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
30030 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
30040 45 58 54 20 29 7b 0a 20 20 20 20 20 20 70 43 75  EXT ){.      pCu
30050 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
30060 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
30070 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
30080 78 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  xt>0 ) return SQ
30090 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
300a0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
300b0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64 78  ur->pPage;.  idx
300c0 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20   = ++pCur->ix;. 
300d0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
300e0 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  nit ){.    /* Th
300f0 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79  e only known way
30100 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61 70   for this to hap
30110 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72 65  pen is for there
30120 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20   to be a.    ** 
30130 72 65 63 75 72 73 69 76 65 20 53 51 4c 20 66 75  recursive SQL fu
30140 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65 73  nction that does
30150 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74   a DELETE operat
30160 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  ion as part of a
30170 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 77  .    ** SELECT w
30180 68 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f 6e  hich deletes con
30190 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e  tent out from un
301a0 64 65 72 20 61 6e 20 61 63 74 69 76 65 20 63 75  der an active cu
301b0 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61  rsor.    ** in a
301c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
301d0 65 20 66 69 6c 65 20 77 68 65 72 65 20 74 68 65  e file where the
301e0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45 4c   table being DEL
301f0 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20  ETE-ed from.    
30200 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e 20  ** has pages in 
30210 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65 20  common with the 
30220 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  table being quer
30230 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20 20  ied.  See TH3.  
30240 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31    ** module cov1
30250 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20 74 65  /btree78.test te
30260 73 74 63 61 73 65 20 32 32 30 20 28 32 30 31 38  stcase 220 (2018
30270 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20  -06-08) for an. 
30280 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a     ** example. *
30290 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
302a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
302b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
302c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
302d0 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
302e0 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
302f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
30300 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
30310 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
30320 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
30330 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
30340 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
30350 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
30360 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
30370 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
30380 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
30390 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
303a0 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
303b0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
303c0 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
303d0 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
303e0 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
303f0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
30400 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
30410 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
30420 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
30430 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
30440 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
30450 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
30470 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
30480 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
30490 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
304a0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
304b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
304c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
304d0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
304e0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
304f0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
30500 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
30510 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
30520 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
30530 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
30540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30550 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
30560 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
30570 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
30580 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
30590 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
305a0 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
305b0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
305c0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
305d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
305e0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
305f0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
30600 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
30610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30620 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
30630 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30650 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
30660 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
30670 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
30680 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
30690 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
306a0 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
306b0 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
306c0 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Page;.  UNUSED_P
306d0 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
306e0 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
306f0 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
30700 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
30710 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30720 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
30740 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
30750 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ==1 );.  pCur->i
30760 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
30770 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
30780 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
30790 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
307a0 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  fl);.  if( pCur-
307b0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
307c0 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
307d0 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a  treeNext(pCur);.
307e0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
307f0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b  pPage;.  if( (++
30800 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65  pCur->ix)>=pPage
30810 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
30820 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72  Cur->ix--;.    r
30830 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
30840 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pCur);.  }.  if(
30850 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
30860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30870 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
30880 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
30890 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
308a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
308b0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
308c0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
308d0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
308e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
308f0 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73  ** Return values
30900 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
30910 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73  TE_OK     succes
30920 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
30930 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f  DONE   the curso
30940 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20  r is already on 
30950 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e  the first elemen
30960 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a  t of the table.*
30970 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  *     otherwise 
30980 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
30990 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
309a0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
309b0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
309c0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
309d0 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
309e0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
309f0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
30a00 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
30a10 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
30a20 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
30a30 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
30a40 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
30a50 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
30a60 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
30a70 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
30a80 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
30a90 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
30aa0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
30ab0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
30ac0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
30ad0 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
30ae0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
30af0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
30b00 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
30b10 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
30b20 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
30b30 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a  C,F) is 1, then.
30b40 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  ** the cursor co
30b50 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
30b60 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
30b70 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
30b80 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
30b90 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
30ba0 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
30bb0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
30bc0 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   The F argument 
30bd0 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20  is a.** hint to 
30be0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
30bf0 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74  The native SQLit
30c00 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
30c10 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a  tation does not.
30c20 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ** use this hint
30c30 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
30c40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
30c50 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
30c60 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
30c70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
30c80 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
30c90 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
30ca0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
30cb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
30cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
30cd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30ce0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30cf0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30d00 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
30d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30d20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30d30 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
30d40 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
30d50 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
30d60 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
30d70 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
30d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
30da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30db0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
30dc0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
30dd0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
30de0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
30df0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
30e00 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
30e10 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
30e20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
30e30 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
30e40 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
30e50 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 20 72 65  >skipNext<0 ) re
30e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30e70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
30e80 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30ea0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
30eb0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30ec0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
30ed0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72   pCur->ix;.    r
30ee0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
30ef0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
30f00 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
30f10 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
30f20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30f30 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
30f40 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
30f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
30f60 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29  e( pCur->ix==0 )
30f70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
30f80 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
30f90 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30fa0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
30fb0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
30fc0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
30fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
30fe0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
30ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
31000 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
31010 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
31020 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
31030 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
31040 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
31050 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
31060 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
31070 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
31080 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
31090 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
310a0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
310b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
310c0 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20  ious(pCur, 0);. 
310d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
310e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
310f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31100 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
31110 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
31120 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
31130 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
31140 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
31150 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
31160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
31170 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
31180 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =1 );.  UNUSED_P
31190 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
311a0 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
311b0 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
311c0 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
311d0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
311e0 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
311f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
31200 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b  BTCF_ValidNKey);
31210 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
31220 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
31230 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
31240 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20  SOR_VALID.   || 
31250 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c  pCur->ix==0.   |
31260 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  | pCur->pPage->l
31270 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
31280 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
31290 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a  ious(pCur);.  }.
312a0 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
312b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
312c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
312d0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
312e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
312f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
31300 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
31310 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
31320 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
31330 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31340 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
31350 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
31360 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
31370 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
31380 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
31390 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
313a0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
313b0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
313c0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
313d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
313e0 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
313f0 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
31400 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
31410 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
31420 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
31430 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
31440 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
31450 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
31460 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
31470 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e  NULL in the even
31480 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
31490 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
314a0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
314b0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
314c0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
314d0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
314e0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
314f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
31500 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
31510 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
31520 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
31530 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
31540 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
31550 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
31560 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
31570 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
31580 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
31590 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
315a0 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
315b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
315c0 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
315d0 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
315e0 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
315f0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
31600 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
31610 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
31620 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
31630 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
31640 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
31650 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
31660 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
31670 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
31680 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
31690 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
316a0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
316b0 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
316c0 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
316d0 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
316e0 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
316f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
31700 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31710 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
31720 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
31730 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
31740 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
31750 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
31760 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
31770 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
31780 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
31790 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
317a0 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
317b0 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
317c0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
317d0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
317e0 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
317f0 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
31800 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
31810 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
31820 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
31830 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
31840 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
31850 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
31860 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
31870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31880 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
31890 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
318a0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
318b0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
318c0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
318d0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
318e0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
318f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
31900 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
31910 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
31920 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
31930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31940 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
31950 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31960 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
31980 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
31990 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
319a0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
319b0 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
319c0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
319d0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
319e0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
319f0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
31a00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
31a10 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
31a20 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
31a30 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
31a40 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
31a50 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
31a60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31a70 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
31a80 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
31a90 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
31aa0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
31ab0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
31ac0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
31ad0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
31ae0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31af0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
31b00 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
31b10 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
31b20 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
31b30 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
31b40 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
31b50 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
31b60 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
31b70 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
31b80 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
31b90 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
31ba0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75  nearby' */.    u
31bb0 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20  32 nSearch = 0; 
31bc0 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68    /* Count of th
31bd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72  e number of sear
31be0 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20  ch attempts */. 
31bf0 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
31c00 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
31c10 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
31c20 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
31c30 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
31c40 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
31c50 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
31c60 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
31c70 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
31c80 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
31c90 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
31ca0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
31cb0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
31cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31cd0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
31ce0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31cf0 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
31d00 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
31d10 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
31d20 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
31d30 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
31d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31d50 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31d60 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
31d70 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
31d80 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
31d90 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
31da0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31db0 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
31dc0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
31dd0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
31de0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
31df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e00 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
31e10 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31e20 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
31e30 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
31e40 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
31e50 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
31e60 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
31e70 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
31e80 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
31e90 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
31ea0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
31eb0 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
31ec0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
31ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
31ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31ef0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31f00 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
31f10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
31f20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
31f30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
31f40 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
31f50 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
31f60 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
31f70 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
31f80 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
31f90 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
31fa0 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
31fb0 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
31fc0 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
31fd0 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
31fe0 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
31ff0 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
32000 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
32010 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
32020 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
32030 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
32040 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
32050 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
32060 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
32070 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
32080 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
32090 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
320a0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
320b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
320c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30  DENCE-OF: R-0150
320d0 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73  6-11053 The firs
320e0 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  t integer on a f
320f0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
32100 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ge.        ** is
32110 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
32120 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
32130 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
32140 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a   in the list or.
32150 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20          ** zero 
32160 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c  if this is the l
32170 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75  ast freelist tru
32180 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nk page. */.    
32190 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
321a0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
321b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
321c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
321d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
321e0 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38  F: R-59841-13798
321f0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
32200 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
32210 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20  t offset 32.    
32220 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68      ** stores th
32230 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
32240 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
32250 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  of the freelist,
32260 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20   or zero if.    
32270 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c      ** the freel
32280 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ist is empty. */
32290 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
322a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
322b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
322c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
322d0 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
322e0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
322f0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
32300 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e  e || nSearch++ >
32310 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   n ){.        rc
32320 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32330 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72 75 6e  T_PGNO(pPrevTrun
32340 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e  k ? pPrevTrunk->
32350 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20  pgno : 1);.     
32360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32370 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32380 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
32390 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
323a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
323b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
323c0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
323d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
323e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
323f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
32400 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
32410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32420 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
32430 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
32440 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
32450 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
32460 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
32470 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
32480 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
32490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
324a0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
324b0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
324c0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
324d0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
324e0 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
324f0 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
32500 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
32510 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
32520 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
32530 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
32540 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
32550 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
32560 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
32570 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
32580 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
32590 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
325a0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
325b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
325c0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
325d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
325e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
325f0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32600 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32620 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32630 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32640 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
32650 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
32660 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
32670 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
32680 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
32690 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
326a0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
326b0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
326c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
326d0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
326e0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
326f0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
32700 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
32710 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
32720 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
32730 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
32740 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32750 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
32760 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
32770 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
32780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32790 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
327a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 67  runk);.        g
327b0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
327c0 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
327d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
327e0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
327f0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
32800 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
32810 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b   (nearby==iTrunk
32820 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72   || (iTrunk<near
32830 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
32840 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
32850 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32860 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
32870 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
32880 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
32890 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
328a0 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
328b0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
328c0 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
328d0 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
328e0 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  /.        *pPgno
328f0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
32900 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
32910 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
32920 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
32930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32940 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32950 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32960 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32980 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32990 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
329a0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
329b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
329c0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
329d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
329e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
329f0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
32a00 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
32a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32a30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32a40 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
32a50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
32a60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32a70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32a80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32a90 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32ab0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
32ac0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
32ad0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
32ae0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
32af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
32b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32b10 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
32b20 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
32b30 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
32b40 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
32b50 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
32b60 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
32b70 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
32b80 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
32b90 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
32ba0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
32bb0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
32bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
32bd0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
32be0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
32bf0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
32c00 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32c10 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
32c20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
32c30 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
32c40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
32c50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
32c60 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
32c70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32c80 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32c90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32ca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
32cb0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
32cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
32cd0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32ce0 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
32cf0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
32d00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
32d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32d20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
32d30 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32d40 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
32d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32d70 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
32d80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32d90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32da0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32db0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32dc0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
32dd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32de0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32df0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32e00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32e10 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32e20 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
32e30 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
32e40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32e50 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32e60 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
32e70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
32e80 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
32e90 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32ea0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
32eb0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
32ec0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
32ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32ee0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32ef0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
32f00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
32f10 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32f20 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
32f30 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
32f40 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32f50 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
32f60 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
32f70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
32f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32f90 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
32fa0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32fd0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32fe0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33000 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
33010 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
33020 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
33030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
33050 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
33060 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
33070 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
33080 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
33090 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
330a0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
330b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
330c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
330d0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
330e0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
330f0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
33100 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
33110 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
33120 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
33130 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
33140 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
33150 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
33160 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
33170 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
33180 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
33190 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
331a0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
331b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
331c0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
331d0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
331e0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
331f0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
33200 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
33210 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
33220 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
33230 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
33240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
33260 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
33270 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33280 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
33290 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
332a0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
332b0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
332c0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
332d0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
332e0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
332f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
33300 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
33310 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
33320 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
33330 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
33340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
33350 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
33360 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
33370 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
33380 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
33390 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
333a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
333b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
333c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
333d0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
333e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
333f0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
33400 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
33410 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
33420 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
33430 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
33440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
33450 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
33460 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33470 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
33480 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
33490 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
334a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
334b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
334c0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
334d0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
334e0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
334f0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
33500 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
33510 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
33520 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
33530 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
33540 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
33550 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
33560 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
33570 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
33580 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
33590 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
335a0 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
335b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
335c0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
335d0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
335f0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
33600 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
33610 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
33620 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33630 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
33640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33650 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
33660 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
33670 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
33680 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
33690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
336a0 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
336b0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
336c0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
336d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
336e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
336f0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
33700 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
33710 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
33720 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
33730 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54  Pgno)? PAGER_GET
33740 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
33750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
33760 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
33770 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
33780 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
33790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
337a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
337b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
337c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
337d0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
337e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
337f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33810 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
33820 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
33830 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70               *pp
33840 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
33850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
33870 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
33880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33890 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
338a0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
338b0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
338c0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
338d0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
338e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
338f0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
33900 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
33910 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
33920 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
33930 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33940 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
33950 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
33960 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
33970 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
33980 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
33990 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
339a0 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
339b0 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
339c0 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
339d0 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
339e0 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
339f0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
33a00 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
33a10 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
33a20 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
33a30 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
33a40 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
33a50 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
33a60 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
33a70 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
33a80 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
33a90 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
33aa0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
33ab0 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
33ac0 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
33ad0 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
33ae0 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
33af0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
33b00 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
33b10 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
33b20 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
33b30 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
33b40 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
33b50 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
33b60 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
33b70 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
33b80 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
33b90 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
33ba0 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
33bb0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
33bc0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
33bd0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
33be0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
33bf0 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
33c00 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
33c10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
33c20 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
33c30 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
33c40 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
33c50 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
33c60 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
33c70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
33c80 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
33c90 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
33ca0 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
33cb0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
33cc0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
33cd0 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
33ce0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
33cf0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
33d00 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
33d10 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
33d20 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
33d30 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  e))? PAGER_GET_N
33d40 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20  OCONTENT:0;..   
33d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33d60 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
33d70 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
33d80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33d90 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
33da0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
33db0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
33dc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33dd0 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
33de0 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
33df0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33e00 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33e10 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
33e20 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
33e30 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
33e40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
33e50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
33e60 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33e70 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
33e80 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
33e90 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
33ea0 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
33eb0 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
33ec0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
33ed0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
33ee0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
33ef0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
33f00 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
33f10 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
33f20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
33f30 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
33f40 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
33f50 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
33f60 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
33f70 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
33f80 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
33f90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
33fa0 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
33fb0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
33fc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
33fd0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
33fe0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33ff0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
34000 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
34010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34030 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
34040 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
34050 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34060 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
34070 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34090 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
340a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
340b0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
340c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
340d0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
340e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
340f0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
34100 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
34110 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
34120 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
34130 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
34140 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
34150 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
34160 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
34170 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34180 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
34190 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43  no, ppPage, bNoC
341a0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  ontent);.    if(
341b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
341c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
341d0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
341e0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
341f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34210 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
34220 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
34230 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  age = 0;.    }. 
34240 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
34250 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
34260 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
34270 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
34280 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34290 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44   || *pPgno!=PEND
342a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
342b0 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
342c0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
342d0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
342e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
342f0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73  PrevTrunk);.  as
34300 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34310 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
34320 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
34330 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
34340 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65  ge)<=1 );.  asse
34350 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
34360 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  K || (*ppPage)->
34370 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72  isInit==0 );.  r
34380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
34390 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
343a0 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
343b0 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
343c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
343d0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
343e0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
343f0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
34400 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
34410 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
34420 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
34430 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
34440 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
34450 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
34460 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
34470 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
34480 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
34490 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
344a0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
344b0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
344c0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
344d0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
344e0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
344f0 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
34500 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
34510 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
34520 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
34530 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
34540 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
34550 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
34560 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
34570 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
34580 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
34590 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
345a0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
345b0 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
345c0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
345d0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
345e0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
345f0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
34600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
34610 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34620 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
34630 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
34640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34650 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
34660 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34670 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
34680 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
34690 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
346a0 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
346b0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
346c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
346d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346e0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
346f0 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
34700 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34730 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
34740 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34760 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
34770 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34780 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
34790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
347a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
347b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
347c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
347d0 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a  B || iPage>1 );.
347e0 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
347f0 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
34800 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
34810 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29  .  if( iPage<2 )
34820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34830 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69  ORRUPT_BKPT;.  i
34840 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
34850 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
34860 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
34870 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
34880 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
34890 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
348a0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
348b0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
348c0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
348d0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
348e0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
348f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
34900 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
34910 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34920 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
34930 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
34940 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
34950 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
34960 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
34970 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
34980 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
34990 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
349a0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
349b0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
349c0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
349d0 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
349e0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
349f0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
34a00 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
34a10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
34a20 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
34a30 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
34a40 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
34a50 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
34a60 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
34a70 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
34a80 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
34a90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34aa0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34ab0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
34ac0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34ad0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
34ae0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
34af0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
34b00 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
34b10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
34b20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
34b30 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
34b40 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
34b50 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34b60 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
34b70 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
34b80 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
34b90 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
34ba0 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
34bb0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
34bc0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
34bd0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
34be0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
34bf0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
34c00 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
34c10 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
34c20 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
34c30 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
34c40 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
34c50 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
34c60 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
34c70 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
34c80 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
34c90 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
34ca0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
34cb0 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
34cc0 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
34cd0 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
34ce0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
34cf0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
34d00 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
34d10 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
34d20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
34d30 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
34d40 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
34d50 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
34d60 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
34d70 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
34d80 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
34d90 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
34da0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
34db0 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
34dc0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
34dd0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
34de0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
34df0 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
34e00 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
34e10 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
34e20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
34e30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
34e40 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
34e50 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
34e60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34e80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34e90 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
34ea0 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
34eb0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
34ec0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
34ed0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
34ee0 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
34ef0 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
34f00 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
34f10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
34f20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34f30 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
34f40 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
34f50 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
34f60 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
34f70 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
34f80 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
34f90 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
34fa0 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
34fb0 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
34fc0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
34fd0 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
34fe0 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
34ff0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
35000 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
35010 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
35020 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
35030 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
35040 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
35050 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
35060 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
35070 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
35080 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
35090 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
350a0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
350b0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
350c0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
350d0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
350e0 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
350f0 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
35100 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
35110 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
35120 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
35130 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
35140 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
35150 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
35160 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
35170 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
35180 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
35190 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
351a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
351b0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
351c0 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
351d0 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
351e0 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
351f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
35200 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
35210 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
35220 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
35230 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
35240 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
35250 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
35260 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
35270 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
35280 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
35290 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
352a0 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
352b0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
352c0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
352d0 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  8"..      **.   
352e0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
352f0 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36  F: R-19920-11576
35300 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20   However, newer 
35310 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
35320 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a  te still.      *
35330 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68  * avoid using th
35340 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69  e last six entri
35350 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69  es in the freeli
35360 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72  st trunk page ar
35370 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ray in.      ** 
35380 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62  order that datab
35390 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65  ase files create
353a0 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69  d by newer versi
353b0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
353c0 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65  n be.      ** re
353d0 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ad by older vers
353e0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a  ions of SQLite..
353f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35400 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35410 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
35420 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
35430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35440 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
35450 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
35460 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
35470 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
35480 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
35490 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
354a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
354b0 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
354c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
354d0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
354e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
354f0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
35500 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
35510 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
35520 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
35530 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
35540 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
35550 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
35560 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
35570 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
35580 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
35590 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
355a0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
355b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
355c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
355d0 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
355e0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
355f0 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
35600 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
35610 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
35620 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
35630 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
35640 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
35650 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
35660 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
35670 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
35680 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
35690 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
356a0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
356b0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
356c0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
356d0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
356e0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
356f0 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
35700 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
35710 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
35720 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
35730 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
35740 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
35750 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
35760 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
35770 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
35780 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
35790 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
357a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
357b0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
357c0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
357d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
357e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
357f0 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
35800 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
35810 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
35820 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
35830 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
35840 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
35850 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
35860 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
35870 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
35880 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
35890 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
358a0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
358b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
358c0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
358d0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
358e0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
358f0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
35900 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
35910 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
35920 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
35930 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
35940 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
35950 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
35960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35970 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
35980 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
35990 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
359a0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
359b0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
359c0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
359d0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
359e0 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65  ven Cell.  Store
359f0 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61  .** size informa
35a00 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
35a10 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f  ell in pInfo..*/
35a20 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
35a30 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  rCell(.  MemPage
35a40 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
35a50 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
35a60 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
35a70 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  Cell */.  unsign
35a80 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
35a90 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
35aa0 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a   of the Cell */.
35ab0 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
35ac0 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  o          /* Si
35ad0 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ze information a
35ae0 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f  bout the cell */
35af0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
35b00 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  pBt;.  Pgno ovfl
35b10 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
35b20 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
35b30 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
35b40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
35b50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35b60 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
35b70 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
35b80 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
35b90 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
35ba0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63   if( pInfo->nLoc
35bb0 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  al==pInfo->nPayl
35bc0 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  oad ){.    retur
35bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
35be0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
35bf0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
35c00 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
35c10 67 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63  g */.  }.  testc
35c20 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e  ase( pCell + pIn
35c30 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70 50 61  fo->nSize == pPa
35c40 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
35c50 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
35c60 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a  l + (pInfo->nSiz
35c70 65 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d 3e 61  e-1) == pPage->a
35c80 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 69 66 28  DataEnd );.  if(
35c90 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e   pCell + pInfo->
35ca0 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61  nSize > pPage->a
35cb0 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 2f  DataEnd ){.    /
35cc0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
35cd0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
35ce0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
35cf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
35d00 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
35d10 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
35d20 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66  yte(pCell + pInf
35d30 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20  o->nSize - 4);. 
35d40 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
35d50 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
35d60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
35d70 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
35d80 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
35d90 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
35da0 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79  l = (pInfo->nPay
35db0 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c  load - pInfo->nL
35dc0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
35dd0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
35de0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
35df0 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20   nOvfl>0 || .   
35e00 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20   (CORRUPT_DB && 
35e10 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
35e20 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29   + ovflPageSize)
35e30 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20  <ovflPageSize). 
35e40 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
35e50 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
35e60 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
35e70 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
35e80 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
35e90 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
35ea0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
35eb0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
35ec0 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
35ed0 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
35ee0 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
35ef0 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
35f00 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
35f10 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
35f20 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
35f30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
35f40 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
35f50 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
35f60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
35f70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
35f80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35fa0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
35fb0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
35fc0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
35fd0 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
35fe0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
35ff0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36000 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
36010 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
36020 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
36030 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
36040 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
36050 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
36060 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
36070 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
36080 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
36090 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
360a0 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
360b0 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
360c0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
360d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
360e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
360f0 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
36100 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
36110 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
36120 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
36130 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
36140 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
36150 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
36160 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
36170 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
36180 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
36190 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
361a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
361b0 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
361c0 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
361d0 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
361e0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
361f0 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
36200 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
36210 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
36220 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
36230 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
36240 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
36250 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
36260 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
36270 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
36280 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
36290 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
362a0 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
362b0 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
362c0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
362d0 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
362e0 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
362f0 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
36300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
36320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36330 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
36340 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
36350 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
36360 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
36370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36380 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
36390 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
363a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
363b0 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
363c0 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
363d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
363e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
363f0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
36400 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
36410 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
36420 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
36430 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
36440 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
36450 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
36460 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
36470 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
36480 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
36490 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
364a0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
364b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
364c0 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
364d0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
364e0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
364f0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
36500 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
36510 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
36520 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
36530 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
36540 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
36550 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
36560 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
36570 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
36580 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
36590 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
365a0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
365b0 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
365c0 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
365d0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
365e0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
365f0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
36600 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
36610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36620 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
36630 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
36640 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
36650 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
36660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
36670 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
36680 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42  ell */.  const B
36690 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c  treePayload *pX,
366a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f          /* Paylo
366b0 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f  ad with which to
366c0 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63   construct the c
366d0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ell */.  int *pn
366e0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
366f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
36700 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
36710 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
36720 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
36730 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
36740 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20  rc, n, rc, mn;. 
36750 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
36760 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
36770 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65  lease;.  unsigne
36780 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
36790 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
367a0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
367b0 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67  hared *pBt;.  Pg
367c0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69  no pgnoOvfl;.  i
367d0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
367e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
367f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36800 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
36810 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
36820 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
36830 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
36840 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
36850 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
36860 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
36870 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
36880 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
36890 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
368a0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
368b0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
368c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
368d0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
368e0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
368f0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
36900 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
36910 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36920 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
36930 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
36940 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
36950 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66  ildPtrSize;.  if
36960 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
36970 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ){.    nPayload 
36980 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58  = pX->nData + pX
36990 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72  ->nZero;.    pSr
369a0 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20  c = pX->pData;. 
369b0 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44     nSrc = pX->nD
369c0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
369d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
369e0 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43  af ); /* fillInC
369f0 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65  ell() only calle
36a00 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a  d for leaves */.
36a10 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
36a20 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
36a30 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
36a40 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64  load);.    nHead
36a50 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
36a60 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
36a70 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65   *(u64*)&pX->nKe
36a80 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
36a90 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65   assert( pX->nKe
36aa0 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26  y<=0x7fffffff &&
36ab0 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a   pX->pKey!=0 );.
36ac0 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c      nSrc = nPayl
36ad0 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e  oad = (int)pX->n
36ae0 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
36af0 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48  pX->pKey;.    nH
36b00 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
36b10 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
36b20 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
36b30 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  .  }.  .  /* Fil
36b40 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
36b50 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d   */.  pPayload =
36b60 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
36b70 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
36b80 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
36b90 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
36ba0 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
36bb0 61 73 65 20 77 68 65 72 65 20 65 76 65 72 79 74  ase where everyt
36bc0 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68 65  hing fits on the
36bd0 20 62 74 72 65 65 20 70 61 67 65 0a 20 20 20 20   btree page.    
36be0 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c  ** and no overfl
36bf0 6f 77 20 70 61 67 65 73 20 61 72 65 20 72 65 71  ow pages are req
36c00 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20  uired. */.    n 
36c10 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
36c20 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
36c30 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
36c40 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
36c50 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
36c60 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
36c70 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65  ze = n;.    asse
36c80 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f  rt( nSrc<=nPaylo
36c90 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ad );.    testca
36ca0 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61  se( nSrc<nPayloa
36cb0 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d );.    memcpy(
36cc0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
36cd0 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65  nSrc);.    memse
36ce0 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c  t(pPayload+nSrc,
36cf0 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72   0, nPayload-nSr
36d00 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  c);.    return S
36d10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
36d20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
36d30 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
36d40 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 6f  eans that some o
36d50 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  f the content wi
36d60 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  ll need.  ** to 
36d70 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66  spill onto overf
36d80 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  low pages..  */.
36d90 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69    mn = pPage->mi
36da0 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e  nLocal;.  n = mn
36db0 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
36dc0 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  n) % (pPage->pBt
36dd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
36de0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
36df0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
36e00 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
36e10 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
36e20 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
36e30 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
36e40 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73  al ) n = mn;.  s
36e50 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
36e60 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
36e70 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50 72  eader + 4;.  pPr
36e80 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  ior = &pCell[nHe
36e90 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65  ader+n];.  pToRe
36ea0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e  lease = 0;.  pgn
36eb0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74  oOvfl = 0;.  pBt
36ec0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
36ed0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
36ee0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
36ef0 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
36f00 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
36f10 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
36f20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
36f30 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
36f40 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
36f50 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
36f60 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
36f70 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
36f80 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
36f90 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
36fa0 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
36fb0 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
36fc0 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
36fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fe0 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
36ff0 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
37000 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
37010 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
37020 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
37030 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
37040 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
37050 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
37060 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
37070 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
37080 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
37090 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
370a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
370b0 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
370c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
370d0 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
370e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
370f0 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
37100 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
37110 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
37120 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
37130 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  G.  {.    CellIn
37140 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61  fo info;.    pPa
37150 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
37160 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
37170 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
37180 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28   nHeader==(int)(
37190 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20  info.pPayload - 
371a0 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73  pCell) );.    as
371b0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
371c0 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  =pX->nKey );.   
371d0 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65   assert( *pnSize
371e0 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29   == info.nSize )
371f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70  ;.    assert( sp
37200 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e  aceLeft == info.
37210 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65  nLocal );.  }.#e
37220 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65  ndif..  /* Write
37230 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74   the payload int
37240 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c  o the local Cell
37250 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69   and any extra i
37260 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
37270 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  es */.  while( 1
37280 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79   ){.    n = nPay
37290 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
372a0 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
372b0 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
372c0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
372d0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
372e0 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
372f0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
37300 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
37310 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
37320 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
37330 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
37340 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
37350 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
37360 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
37370 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
37380 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
37390 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
373a0 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
373b0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
373c0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
373d0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
373e0 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
373f0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
37400 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
37410 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
37420 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
37430 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
37440 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
37450 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
37460 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37470 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
37480 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
37490 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65  c>=n ){.      me
374a0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
374b0 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
374c0 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b  se if( nSrc>0 ){
374d0 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b  .      n = nSrc;
374e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
374f0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
37500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37510 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
37520 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
37530 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
37540 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 79   n;.    if( nPay
37550 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b  load<=0 ) break;
37560 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
37570 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
37580 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
37590 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
375a0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73 70  -= n;.    if( sp
375b0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  aceLeft==0 ){.  
375c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
375d0 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  fl = 0;.#ifndef 
375e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
375f0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
37600 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
37610 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
37620 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
37630 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
37640 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
37650 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
37660 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
37670 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
37680 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
37690 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
376a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
376b0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
376c0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
376d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
376e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
376f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
37700 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
37710 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
37720 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
37730 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
37740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37750 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
37760 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
37770 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
37780 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
37790 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
377a0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
377b0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
377c0 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
377d0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
377e0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
377f0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
37800 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
37810 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
37820 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
37830 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
37840 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
37850 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
37860 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
37870 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
37880 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
37890 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
378a0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
378b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
378c0 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
378d0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
378e0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
378f0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
37900 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
37910 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
37920 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
37930 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
37940 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
37950 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
37960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
37970 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37980 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
37990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
379a0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
379b0 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
379c0 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
379d0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
379e0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
379f0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
37a00 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
37a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
37a30 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
37a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37a50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
37a60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37a70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37a80 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
37a90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37aa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
37ab0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
37ac0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
37ad0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
37ae0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
37af0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
37b00 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
37b10 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
37b20 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
37b30 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
37b40 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
37b50 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
37b60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
37b70 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
37b80 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
37b90 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
37ba0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
37bb0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
37bc0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
37bd0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
37be0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
37bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37c00 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
37c10 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
37c20 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
37c30 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
37c40 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
37c50 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37c60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
37c70 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
37c80 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
37c90 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
37ca0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
37cb0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
37cc0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
37cd0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
37ce0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
37cf0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
37d00 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
37d10 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
37d20 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
37d30 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
37d40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
37d50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
37d60 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
37d70 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
37d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
37d90 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
37da0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
37db0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
37dc0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
37dd0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
37de0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
37df0 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
37e00 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
37e10 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
37e20 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
37e30 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
37e40 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
37e50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
37e60 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
37e70 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
37e80 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
37e90 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
37ea0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
37eb0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
37ec0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
37ed0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
37ee0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
37ef0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
37f00 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33   int *pRC){.  u3
37f10 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
37f20 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
37f30 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
37f40 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
37f50 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
37f60 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
37f70 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
37f80 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
37f90 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
37fa0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
37fb0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
37fc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
37fd0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
37fe0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
37ff0 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
38000 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
38010 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
38020 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
38030 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
38040 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
38050 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
38060 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
38070 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
38080 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
38090 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
380a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
380b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
380c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
380d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
380e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
380f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
38100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
38110 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b  age->nFree>=0 );
38120 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
38130 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
38140 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
38150 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
38160 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
38170 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
38180 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
38190 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
381a0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
381b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
381c0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
381d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
381e0 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50    if( pc+sz > pP
381f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
38200 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
38210 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
38220 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
38230 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
38240 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
38250 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
38260 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
38270 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
38280 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
38290 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
382a0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
382b0 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
382c0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
382d0 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
382e0 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
382f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
38300 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
38310 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
38320 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
38330 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
38340 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
38350 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
38360 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
38370 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
38380 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
38390 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
383a0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
383b0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
383c0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
383d0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
383e0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
383f0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
38400 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
38410 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
38420 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
38430 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
38440 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
38450 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
38460 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
38470 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
38480 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
38490 74 68 65