/ Hex Artifact Content
Login

Artifact d711228cac336fb35fff21f3f4a0efe2ad58aa9a800dd02929cdf184be1e78a3:


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: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
7490: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
74a0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
74b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
74c0: 72 20 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75  r to a fake BtCu
74d0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74  rsor object that
74e0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73   will always ans
74f0: 77 65 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20  wer.** false to 
7500: 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
7510: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7520: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20   routine above. 
7530: 20 54 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72   The fake.** cur
7540: 73 6f 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73  sor returned mus
7550: 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69  t not be used wi
7560: 74 68 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72  th any other Btr
7570: 65 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ee interface..*/
7580: 0a 42 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74  .BtCursor *sqlit
7590: 65 33 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64  e3BtreeFakeValid
75a0: 43 75 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20  Cursor(void){.  
75b0: 73 74 61 74 69 63 20 75 38 20 66 61 6b 65 43 75  static u8 fakeCu
75c0: 72 73 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41  rsor = CURSOR_VA
75d0: 4c 49 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  LID;.  assert( o
75e0: 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
75f0: 2c 20 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a  , eState)==0 );.
7600: 20 20 72 65 74 75 72 6e 20 28 42 74 43 75 72 73    return (BtCurs
7610: 6f 72 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b  or*)&fakeCursor;
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7630: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7640: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7650: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7660: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7670: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7680: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7690: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
76a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
76b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
76c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
76d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
76e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
76f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7700: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7710: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7720: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7730: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7740: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7750: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7760: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7770: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7780: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7790: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
77a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
77b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
77c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
77d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
77e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
77f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7800: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7810: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7820: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7830: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7840: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7850: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7860: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7870: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7880: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7890: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
78a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
78b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
78c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
78d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
78e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
78f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7900: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7910: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7920: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7930: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7940: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7950: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7960: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7970: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
79a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
79b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
79c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
79d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
79e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
79f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7a00: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7a10: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7a20: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7a30: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7a40: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7a50: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7a60: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7a70: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7a80: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7a90: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7aa0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7ab0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7ac0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7ad0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7ae0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7af0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7b00: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7b10: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7b20: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7b30: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7b40: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7b50: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7b60: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7b70: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7b80: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7b90: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7ba0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7bb0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7bc0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7bd0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7be0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7bf0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7c00: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7c10: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7c20: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7c40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7c50: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7c60: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7c70: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7c80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7c90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ca0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7cb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7cc0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7cd0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7ce0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7cf0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7d00: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7d10: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7d20: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7d30: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7d40: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7d50: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7d60: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7d70: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7d80: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7d90: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7da0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7db0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7dc0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7de0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7df0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7e00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7e10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7e20: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7e40: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7e50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7e60: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7e70: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7e80: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7e90: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7ea0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7eb0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7ec0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7ed0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7ee0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7ef0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7f00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7f10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7f20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7f50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7f60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7f70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7f80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7f90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7fa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7fb0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7fc0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7fd0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7fe0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7ff0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
8000: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
8010: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
8020: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
8030: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
8040: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
8050: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8060: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
8070: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
8080: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
8090: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
80a0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
80b0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
80c0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
80d0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80e0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
80f0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
8100: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
8110: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8120: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
8130: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8140: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
8150: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
8160: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
8170: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
8180: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
8190: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
81a0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
81b0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
81c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
81d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
81e0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
81f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
8200: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
8210: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
8220: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8230: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
8240: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
8250: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
8260: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
8270: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
8280: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
8290: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
82a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
82b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
82c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
82d0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
82e0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
82f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8300: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
8310: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
8320: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
8330: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8340: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
8350: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
8360: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
8370: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
8380: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
8390: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
83a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
83b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
83c0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
83d0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
83e0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
83f0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8400: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
8410: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8430: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
8440: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
8450: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
8460: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8470: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
8480: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
8490: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
84a0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
84b0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
84c0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
84d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
84e0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
84f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8500: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8510: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8520: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8530: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8540: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8560: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8570: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8580: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8590: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
85a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
85b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
85c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
85d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
85e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
85f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8600: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8610: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8620: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8630: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8640: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8650: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8660: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8670: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8680: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
86a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
86b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
86c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
86d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
86e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
86f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8700: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8710: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8720: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8730: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8740: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8750: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8760: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8770: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8780: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8790: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
87a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
87b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
87c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
87d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
87e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
87f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8800: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8810: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8820: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8830: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8840: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8850: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8860: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8870: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8880: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8890: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
88a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
88b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
88c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
88d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
88e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
88f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8900: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8910: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8920: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8930: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8950: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8960: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8970: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8980: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8990: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
89a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
89b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
89c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
89d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
89e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
89f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8a00: 50 47 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20  PGNO(iPtrmap);. 
8a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8a20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
8a30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
8a40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8a50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
8a60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
8a70: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
8a80: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
8a90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
8aa0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
8ab0: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
8ac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8ad0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8ae0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8af0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8b00: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8b10: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8b20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8b30: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8b40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8b50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8b60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8b70: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8b80: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8b90: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ba0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8bb0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8bc0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8bd0: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8be0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8c80: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8c90: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8ca0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8cb0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8cc0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8cd0: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8ce0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8cf0: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8d00: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8d10: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
8d20: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
8d30: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
8d40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8d50: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
8d60: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
8d70: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
8d80: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
8d90: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
8da0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
8db0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
8dc0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
8dd0: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
8de0: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
8df0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
8e00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
8e10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e20: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
8e30: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
8e40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8e50: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8e60: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8e70: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8ea0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8eb0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8ed0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8ee0: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
8ef0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
8f00: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
8f10: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
8f20: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
8f30: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
8f40: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
8f50: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
8f60: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
8f70: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
8f80: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8f90: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
8fa0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
8fb0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
8fc0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8fd0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8fe0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8ff0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9000: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9010: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9020: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9030: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9040: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9050: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9060: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
9070: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9080: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9090: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
90a0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
90b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
90c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
90d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
90e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
90f0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9100: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9110: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9120: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9130: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9140: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9150: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9160: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
9170: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9180: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9190: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
91a0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
91b0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
91c0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
91d0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
91e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91f0: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9200: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9210: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9220: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9230: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9240: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9250: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9260: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9270: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9280: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9290: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
92a0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
92b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
92c0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
92d0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
92e0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
92f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9300: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9310: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9320: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9330: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9340: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9350: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9360: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
9370: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9380: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9390: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
93a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
93b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
93c0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
93d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
93e0: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
93f0: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9400: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9410: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9420: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9430: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9440: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9450: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9460: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
9470: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9480: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9490: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
94a0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
94b0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
94c0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
94d0: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
94e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
94f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9500: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9510: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9520: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9530: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9540: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9570: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9580: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9590: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
95a0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
95b0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
95c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
95d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
95e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
95f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9600: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9610: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9620: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9640: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9650: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9660: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9670: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9680: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9690: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
96a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
96b0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
96d0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
96e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
96f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9700: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9710: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9720: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9730: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9740: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9750: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9760: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9770: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
97c0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
97d0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
97e0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
97f0: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9800: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9820: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9830: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9840: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9850: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9860: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9880: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
98a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
98b0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
98c0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
98d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
98e0: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
98f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9900: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9910: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9920: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9930: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9940: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9950: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9960: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9970: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9980: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9990: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
99a0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
99b0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
99c0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
99d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
99e0: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
99f0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9a00: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9a10: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9a20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9a30: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9a40: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9a50: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9a60: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9a70: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9a80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9a90: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9aa0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9ab0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9ac0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9ad0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9ae0: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9af0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9b00: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9b10: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9b20: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9b30: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9b40: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9b50: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9b60: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9b70: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9b80: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9b90: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ba0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9bb0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9bc0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9bd0: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9be0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9bf0: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9c10: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9c20: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9c50: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9c60: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9c70: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9c80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9c90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9ca0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9cb0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9cc0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9cd0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9ce0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9cf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9d00: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9d10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9d30: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9d40: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9d50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9d60: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9d70: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9d80: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9d90: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9da0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9db0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9dc0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9dd0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9de0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9df0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9e00: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9e10: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9e20: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
9e30: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
9e40: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
9e50: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9e60: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9e70: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9e80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9e90: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
9ea0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9eb0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9ec0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9ed0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9ef0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9f00: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9f10: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9f20: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9f30: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9f40: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f60: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9f70: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9f80: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9fa0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9fb0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
9fc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9fd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9fe0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a000: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a010: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a020: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a030: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a040: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a050: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a060: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a070: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a080: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a090: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a0a0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a0b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a0c0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0d0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a0e0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a0f0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a100: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a110: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a120: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a130: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a140: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a150: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a160: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a170: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a180: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a190: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a1a0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a1b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a1c0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a1d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a1e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a1f0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a200: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a210: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a220: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a230: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a240: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a250: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a260: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a270: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a280: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a290: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a2a0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a2b0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a2c0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a2d0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a2e0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a2f0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a300: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a310: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a320: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a330: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a340: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a350: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a360: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a370: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a380: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a390: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a3a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a3b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a3c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a3d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a3e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a3f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a400: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a410: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a420: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a430: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a440: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a450: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a470: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a480: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a490: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a4a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a4b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a4c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a4d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a4e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a4f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a500: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a510: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a520: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a530: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a540: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a550: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a560: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a570: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a580: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a590: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a5a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a5b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a5c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a5d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a5e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a5f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a600: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a610: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a620: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a630: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a640: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a650: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a660: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a670: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a680: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a690: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a6a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a6b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a6f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
a700: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
a730: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
a740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a750: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a760: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a770: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a780: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a790: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7a0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7b0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7c0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7d0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7e0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a7f0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a800: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a810: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a820: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a830: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a840: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a850: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a860: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a870: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a890: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8a0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
a8b0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
a8c0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a8d0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a8e0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a8f0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a900: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a910: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a920: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a930: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a940: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a950: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a960: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a970: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a980: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a990: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a9a0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a9b0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a9c0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a9d0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a9e0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a9f0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
aa00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
aa10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
aa20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
aa30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
aa40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
aa50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
aa60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
aa70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
aa80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
aaa0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
aab0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
aac0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
aad0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
aae0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
aaf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ab00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ab10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ab20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ab30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ab40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ab50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ab60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
ab70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
ab80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
ab90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aba0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
abb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
abc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
abd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
abe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
abf0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
ac00: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
ac10: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
ac20: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
ac30: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
ac40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
ac50: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
ac60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
ac70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
ac80: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
ac90: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
aca0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
acb0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
acc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
acd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
ace0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
acf0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
ad00: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
ad10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
ad20: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
ad30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ad50: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
ad60: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
ad70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ad80: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
ad90: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
ada0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
adb0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
adc0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
add0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
ade0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
adf0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
ae00: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
ae10: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
ae20: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
ae30: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
ae40: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
ae50: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
ae60: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
ae70: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
ae80: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
ae90: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
aea0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
aeb0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
aec0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
aed0: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
aee0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
aef0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
af00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
af10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
af20: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
af30: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
af40: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
af50: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
af60: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
af70: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
af80: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
af90: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
afa0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
afb0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
afc0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
afd0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
afe0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
aff0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b000: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b010: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b020: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b030: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b040: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b050: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b060: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b070: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b080: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b090: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b0a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b0b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b0c0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
b0d0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
b0e0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
b0f0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
b100: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
b110: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
b120: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
b130: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
b140: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
b150: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
b160: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
b170: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
b180: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
b190: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
b1a0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
b1b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
b1c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
b1d0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
b1e0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
b1f0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
b200: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c  );.  if( info.nL
b210: 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
b220: 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ad ){.    Pgno o
b230: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
b240: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell[info.nSize
b250: 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  -4]);.    ptrmap
b260: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
b270: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
b280: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
b290: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
b2a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b2b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
b2c0: 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20  age given. This 
b2d0: 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69  routine reorgani
b2e0: 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  zes cells within
b2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20   the.** page so 
b300: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
b310: 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e  o free-blocks on
b320: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
b330: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  list..**.** Para
b340: 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69  meter nMaxFrag i
b350: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
b360: 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74  ount of fragment
b370: 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d 61  ed space that ma
b380: 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20  y be.** present 
b390: 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74 65  in the page afte
b3a0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
b3b0: 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56  eturns..**.** EV
b3c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
b3d0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
b3e0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
b3f0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
b400: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
b410: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
b420: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
b430: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
b440: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
b450: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
b460: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
b470: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
b480: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
b490: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
b4a0: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
b4b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
b4c0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
b4d0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
b4e0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b4f0: 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a   int nMaxFrag){.
b500: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b530: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b550: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
b560: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
b570: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
b590: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
b5a0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
b5b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b5c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b5d0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
b5e0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b600: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
b610: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
b620: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
b630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b640: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
b650: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b660: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
b690: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b6a0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
b6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b6c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b6d0: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
b6e0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b6f0: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
b700: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
b710: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
b720: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
b730: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
b740: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
b750: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b760: 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20  har *src;       
b770: 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f   /* Source of co
b780: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
b790: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
b7a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
b7b0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
b7c0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
b7d0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
b7e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
b7f0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
b800: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
b810: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b820: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b830: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b840: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b860: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b870: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b880: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b8a0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b8b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b8c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b8d0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b8e0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b8f0: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b900: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b910: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b920: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b930: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b940: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b950: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b960: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b970: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b980: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43  [hdr+3]) );.  iC
b990: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b9a0: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
b9b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
b9c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b9d0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68  leSize;..  /* Th
b9e0: 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
b9f0: 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20   pages with two 
ba00: 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c  or fewer free bl
ba10: 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61  ocks and nMaxFra
ba20: 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20  g.  ** or fewer 
ba30: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ba40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
ba50: 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d  t is faster to m
ba60: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  ove the.  ** two
ba70: 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73   (or one) blocks
ba80: 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20   of cells using 
ba90: 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64  memmove() and ad
baa0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20  d the required. 
bab0: 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65   ** offsets to e
bac0: 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ach pointer in t
bad0: 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
bae0: 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73  array than it is
baf0: 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73   to .  ** recons
bb00: 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65  truct the entire
bb10: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28   page.  */.  if(
bb20: 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37   (int)data[hdr+7
bb30: 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20  ]<=nMaxFrag ){. 
bb40: 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67     int iFree = g
bb50: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
bb60: 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  r+1]);.    if( i
bb70: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Free ){.      in
bb80: 74 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62  t iFree2 = get2b
bb90: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d  yte(&data[iFree]
bba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67  );..      /* pag
bbb0: 65 46 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20  eFindSlot() has 
bbc0: 61 6c 72 65 61 64 79 20 76 65 72 69 66 69 65 64  already verified
bbd0: 20 74 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b   that free block
bbe0: 73 20 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20  s are sorted.   
bbf0: 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f     ** in order o
bc00: 66 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  f offset within 
bc10: 74 68 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68  the page, and th
bc20: 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65  at no block exte
bc30: 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73  nds.      ** pas
bc40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
bc50: 20 70 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20   page. Provided 
bc60: 74 68 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f  the two free slo
bc70: 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20  ts do not .     
bc80: 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69   ** overlap, thi
bc90: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
bca0: 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20  t the memmove() 
bcb0: 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c  calls below will
bcc0: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76   not.      ** ov
bcd0: 65 72 77 72 69 74 65 20 74 68 65 20 75 73 61 62  erwrite the usab
bce0: 6c 65 53 69 7a 65 20 62 79 74 65 20 62 75 66 66  leSize byte buff
bcf0: 65 72 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20  er, even if the 
bd00: 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20  database page.  
bd10: 20 20 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70      ** is corrup
bd20: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  t.  */.      ass
bd30: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
bd40: 7c 20 69 46 72 65 65 32 3e 69 46 72 65 65 20 29  | iFree2>iFree )
bd50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd60: 69 46 72 65 65 2b 67 65 74 32 62 79 74 65 28 26  iFree+get2byte(&
bd70: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c  data[iFree+2]) <
bd80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
bd90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
bda0: 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65  ree2==0 || iFree
bdb0: 32 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2+get2byte(&data
bdc0: 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75  [iFree2+2]) <= u
bdd0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
bde0: 20 20 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65      if( 0==iFree
bdf0: 32 20 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65  2 || (data[iFree
be00: 32 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46  2]==0 && data[iF
be10: 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20  ree2+1]==0) ){. 
be20: 20 20 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20         u8 *pEnd 
be30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
be40: 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
be50: 20 20 20 20 20 20 20 75 38 20 2a 70 41 64 64 72         u8 *pAddr
be60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
be70: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
be80: 6e 74 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65  nt sz = get2byte
be90: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29  (&data[iFree+2])
bea0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f  ;.        int to
beb0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
bec0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bed0: 20 20 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72      if( top>=iFr
bee0: 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
bef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf00: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
bf10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bf20: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32 20       if( iFree2 
bf30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
bf40: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69  ert( iFree+sz<=i
bf50: 46 72 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69  Free2 ); /* Veri
bf60: 66 69 65 64 20 62 79 20 70 61 67 65 46 69 6e 64  fied by pageFind
bf70: 53 6c 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  Slot() */.      
bf80: 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79      sz2 = get2by
bf90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bfa0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  2]);.          a
bfb0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b  ssert( iFree+sz+
bfc0: 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65  sz2+iFree2-(iFre
bfd0: 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+sz) <= usableS
bfe0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
bff0: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69   memmove(&data[i
c000: 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64  Free+sz+sz2], &d
c010: 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69  ata[iFree+sz], i
c020: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
c030: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
c040: 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20  += sz2;.        
c050: 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d  }.        cbrk =
c060: 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20   top+sz;.       
c070: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69   assert( cbrk+(i
c080: 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61  Free-top) <= usa
c090: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c0a0: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
c0b0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f  [cbrk], &data[to
c0c0: 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a  p], iFree-top);.
c0d0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64 64          for(pAdd
c0e0: 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  r=&data[cellOffs
c0f0: 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b  et]; pAddr<pEnd;
c100: 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20   pAddr+=2){.    
c110: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
c120: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
c130: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46 72        if( pc<iFr
c140: 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  ee ){ put2byte(p
c150: 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a  Addr, pc+sz); }.
c160: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
c170: 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20  f( pc<iFree2 ){ 
c180: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
c190: 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20  pc+sz2); }.     
c1a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
c1b0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74  o defragment_out
c1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c1d0: 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73    }..  cbrk = us
c1e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
c1f0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c200: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
c210: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
c220: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
c230: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
c240: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
c250: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
c260: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
c270: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
c280: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
c290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2a0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
c2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c2c0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
c2d0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
c2e0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
c2f0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
c300: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
c310: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
c320: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
c330: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
c340: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
c350: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c360: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c380: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c390: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c3a0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
c3b0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
c3c0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
c3d0: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
c3e0: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
c3f0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
c400: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
c410: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
c420: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c430: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c450: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c470: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
c480: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
c490: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
c4a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
c4b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
c4c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
c4d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c4f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c500: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
c510: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
c520: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
c530: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
c540: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
c550: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
c560: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
c570: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
c580: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
c590: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c5a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
c5b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
c5c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
c5d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
c5e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
c5f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
c600: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
c610: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
c620: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
c630: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c640: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c650: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c660: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c670: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c680: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c690: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
c6a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
c6b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
c6c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c6d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
c6e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
c6f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
c700: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
c710: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
c720: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
c730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c740: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c750: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c760: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c780: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
c790: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
c7a0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
c7b0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
c7c0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
c7d0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
c7e0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
c7f0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c800: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
c810: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
c820: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
c830: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
c840: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
c850: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
c860: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
c870: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
c880: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
c890: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
c8a0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
c8b0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
c8c0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
c8d0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
c8e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
c8f0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
c900: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
c910: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
c920: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
c930: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
c940: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
c950: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
c960: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
c970: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
c980: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c990: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
c9a0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
c9b0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
c9c0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
c9d0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
c9e0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
c9f0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
ca00: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
ca10: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
ca20: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
ca30: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
ca40: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
ca50: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
ca60: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
ca70: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
ca80: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
ca90: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
caa0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
cab0: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a  eSize;.  int siz
cac0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cad0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
cae0: 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73  e slot */..  ass
caf0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77  ert( pc>0 );.  w
cb00: 68 69 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65  hile( pc<=usable
cb10: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a  Size-4 ){.    /*
cb20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cb30: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
cb40: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
cb50: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
cb60: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
cb70: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
cb80: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
cb90: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
cba0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
cbb0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
cbc0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
cbd0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
cbe0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
cbf0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
cc00: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
cc10: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
cc20: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
cc30: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
cc40: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
cc50: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
cc60: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
cc80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
cc90: 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20  T_PAGE(pPg);.   
cca0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
ccb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
ccc0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
ccd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cce0: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
ccf0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
cd00: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
cd10: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
cd20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
cd30: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
cd40: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
cd50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
cd60: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
cd70: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
cd80: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
cd90: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
cda0: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
cdb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
cdc0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
cdd0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
cde0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
cdf0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
ce00: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
ce10: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
ce20: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
ce30: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
ce40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ce50: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
ce60: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
ce70: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
ce80: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
ce90: 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  t.         ** fo
cea0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
ceb0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
cec0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
ced0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61       put2byte(&a
cee0: 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  Data[pc+2], x);.
cef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
cf00: 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b  turn &aData[pc +
cf10: 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   x];.    }.    i
cf20: 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70  Addr = pc;.    p
cf30: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cf40: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66  ata[pc]);.    if
cf50: 28 20 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20  ( pc<iAddr+size 
cf60: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
cf70: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( pc ){.    *pR
cf80: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
cf90: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
cfa0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
cfc0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
cfd0: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
cfe0: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
cff0: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
d000: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
d010: 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  t. Write into *p
d020: 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Idx the index in
d030: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  to pPage->aData[
d040: 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73  ].** of the firs
d050: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
d060: 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72  ted space. Retur
d070: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
d080: 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f  OK or.** an erro
d090: 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20  r code (usually 
d0a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
d0b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
d0c0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
d0d0: 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69  t there is suffi
d0e0: 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d  cient space to m
d0f0: 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63  ake the.** alloc
d100: 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75  ation.  This rou
d110: 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20  tine might need 
d120: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e  to defragment in
d130: 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a   order to bring.
d140: 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65  ** all the space
d150: 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76   together, howev
d160: 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
d170: 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69  e will avoid usi
d180: 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ng.** the first 
d190: 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74  two bytes past t
d1a0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d1b0: 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75  area since presu
d1c0: 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c  mably this.** al
d1d0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  location is bein
d1e0: 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20  g made in order 
d1f0: 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  to insert a new 
d200: 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c  cell, so we will
d210: 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20  .** also end up 
d220: 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65  needing a new ce
d230: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
d240: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
d250: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
d260: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
d270: 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20  e, int *pIdx){. 
d280: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
d290: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d2a0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
d2b0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68  ache of pPage->h
d2c0: 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38  drOffset */.  u8
d2d0: 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
d2e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
d2f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d300: 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
d310: 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  a */.  int top; 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d340: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
d350: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
d360: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
d370: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
d390: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
d3a0: 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20  */.  int gap;   
d3b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d3c0: 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65  te of gap betwee
d3d0: 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20  n cell pointers 
d3e0: 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  and cell content
d3f0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
d400: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
d410: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
d420: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d430: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
d440: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d460: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d470: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d480: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
d490: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d4a0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
d4c0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
d4d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
d4e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
d4f0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28  ssert( nByte < (
d500: 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d  int)(pPage->pBt-
d510: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29  >usableSize-8) )
d520: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
d530: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d540: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
d550: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
d560: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
d570: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
d580: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
d590: 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29  rt( gap<=65536 )
d5a0: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
d5b0: 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39  OF: R-29356-0239
d5c0: 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  1 If the databas
d5d0: 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62  e uses a 65536-b
d5e0: 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20  yte page size.  
d5f0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72  ** and the reser
d600: 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72  ved space is zer
d610: 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c  o (the usual val
d620: 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20  ue for reserved 
d630: 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e  space).  ** then
d640: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d650: 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65  t offset of an e
d660: 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20  mpty page wants 
d670: 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a  to be 65536..  *
d680: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
d690: 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c  integer is too l
d6a0: 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65  arge to be store
d6b0: 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e  d in a 2-byte un
d6c0: 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65  signed.  ** inte
d6d0: 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20  ger, so a value 
d6e0: 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20  of 0 is used in 
d6f0: 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20  its place. */.  
d700: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
d710: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d720: 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e  assert( top<=(in
d730: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
d740: 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50  ableSize ); /* P
d750: 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64  revent by getAnd
d760: 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20  InitPage() */.  
d770: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20  if( gap>top ){. 
d780: 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26     if( top==0 &&
d790: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d7a0: 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29  bleSize==65536 )
d7b0: 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35  {.      top = 65
d7c0: 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  536;.    }else{.
d7d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d7e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
d7f0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d800: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
d810: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
d820: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
d830: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
d840: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
d850: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
d860: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
d870: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d880: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
d890: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
d8a0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
d8b0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
d8c0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
d8d0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
d8e0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
d8f0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
d900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d910: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
d920: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
d930: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
d940: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
d950: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
d960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
d970: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
d980: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
d990: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
d9a0: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
d9c0: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
d9d0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
d9e0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
d9f0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
da00: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
da10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
da50: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
da60: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
da70: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
da80: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
da90: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
daa0: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
dab0: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
dac0: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
dad0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
dae0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
daf0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db10: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
db20: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
db30: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
db40: 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28  Page(pPage, MIN(
db50: 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  4, pPage->nFree 
db60: 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20  - (2+nByte)));. 
db70: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
db80: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
db90: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
dba0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
dbb0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
dbc0: 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  2+nByte<=top );.
dbd0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
dbe0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
dbf0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
dc00: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
dc10: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
dc20: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
dc30: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
dc40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
dc50: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
dc60: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
dc70: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
dc80: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
dc90: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
dca0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
dcb0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
dcc0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
dcd0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
dce0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
dcf0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
dd00: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
dd10: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
dd20: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
dd30: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
dd40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
dd50: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
dd60: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
dd70: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd80: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
dd90: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
dda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ddc0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
ddd0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
dde0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
ddf0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
de00: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
de10: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
de20: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
de30: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
de40: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
de50: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
de60: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
de70: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
de80: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
de90: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
dea0: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
deb0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
dec0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
ded0: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
dee0: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
def0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
df00: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
df10: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
df20: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
df30: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
df40: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
df50: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
df60: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
df70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
df80: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
df90: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
dfa0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
dfb0: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
dfc0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
dfd0: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
dfe0: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
dff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
e000: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
e010: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
e020: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
e030: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
e040: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e060: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
e070: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
e080: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
e090: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0b0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
e0c0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
e0d0: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
e100: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
e110: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
e120: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
e150: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
e160: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
e170: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e190: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
e1a0: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36  f iSize */.  u16
e1b0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
e1e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
e1f0: 61 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20  a */.  u32 iEnd 
e200: 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65  = iStart + iSize
e210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e220: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
e230: 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65  the iStart buffe
e240: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
e250: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
e260: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20  ge->aData;   /* 
e270: 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  Page content */.
e280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e290: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
e2a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e2b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
e2c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e2d0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e2e0: 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e  PT_DB || iStart>
e2f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
e300: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
e310: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
e320: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
e330: 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65  || iEnd <= pPage
e340: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
e360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e370: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e380: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e390: 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20  ( iSize>=4 );   
e3a0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
e3b0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
e3c0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70  ssert( iStart<=p
e3d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
e3e0: 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a  eSize-4 );..  /*
e3f0: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
e400: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
e410: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
e420: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
e430: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
e440: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
e450: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
e460: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
e470: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
e480: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
e490: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
e4a0: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
e4b0: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
e4c0: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
e4d0: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
e4e0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
e4f0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
e500: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
e510: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
e520: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
e530: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
e540: 29 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  )<iStart ){.    
e550: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
e560: 50 74 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  Ptr+4 ){.       
e570: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30   if( iFreeBlk==0
e580: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
e5b0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
e5c0: 20 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42     iPtr = iFreeB
e5d0: 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  lk;.    }.    if
e5e0: 28 20 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65  ( iFreeBlk>pPage
e5f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
e600: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  e-4 ){.      ret
e610: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e620: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e630: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
e640: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
e650: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
e660: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
e670: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
e680: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
e690: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
e6a0: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
e6b0: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
e6c0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
e6d0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
e6e0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
e6f0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
e700: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
e710: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
e720: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
e730: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
e740: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
e750: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
e760: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
e770: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
e780: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
e790: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
e7a0: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
e7b0: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
e7c0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e7d0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45  pPage);.      iE
e7e0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
e7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e800: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
e810: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
e820: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e830: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
e840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e850: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e860: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e870: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
e880: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
e890: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e8a0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
e8b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
e8c0: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
e8d0: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
e8e0: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
e8f0: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
e900: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
e910: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
e920: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
e930: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
e940: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
e950: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
e960: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e970: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
e980: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
e990: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
e9a0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
e9b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
e9c0: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
e9d0: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
e9e0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
e9f0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
ea00: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
ea10: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ea20: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Page);.        n
ea30: 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d  Frag += iStart -
ea40: 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20   iPtrEnd;.      
ea50: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
ea60: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69   iPtr;.        i
ea70: 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20  Start = iPtr;.  
ea80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ea90: 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68  if( nFrag>data[h
eaa0: 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53  dr+7] ) return S
eab0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eac0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64  GE(pPage);.    d
ead0: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
eae0: 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67  rag;.  }.  x = g
eaf0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb00: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74  r+5]);.  if( iSt
eb10: 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a  art<=x ){.    /*
eb20: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
eb30: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
eb40: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
eb50: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
eb60: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
eb70: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
eb80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
eb90: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
eba0: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
ebb0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
ebc0: 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 3c  .    if( iStart<
ebd0: 78 20 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31  x || iPtr!=hdr+1
ebe0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ebf0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ec00: 61 67 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  age);.    put2by
ec10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  te(&data[hdr+1],
ec20: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
ec30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ec40: 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20  dr+5], iEnd);.  
ec50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
ec60: 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65  sert the new fre
ec70: 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20  eblock into the 
ec80: 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20  freelist */.    
ec90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
eca0: 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20  Ptr], iStart);. 
ecb0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
ecc0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
ecd0: 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20  BTS_FAST_SECURE 
ece0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
ecf0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
ed00: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
ed10: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
ed20: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
ed30: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
ed40: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
ed50: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
ed60: 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  0, iSize);.  }. 
ed70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ed80: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
ed90: 6b 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  k);.  put2byte(&
eda0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
edb0: 69 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  iSize);.  pPage-
edc0: 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53  >nFree += iOrigS
edd0: 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
ede0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
edf0: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61  * Decode the fla
ee00: 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72  gs byte (the fir
ee10: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68  st byte of the h
ee20: 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67  eader) for a pag
ee30: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
ee40: 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ize fields of th
ee50: 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
ee60: 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ure accordingly.
ee70: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
ee80: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
ee90: 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f  ations are suppo
eea0: 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20  rted.  Anything 
eeb0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64  different.** ind
eec0: 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74  icates a corrupt
eed0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a   database files:
eee0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  .**.**         P
eef0: 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20  TF_ZERODATA.**  
ef00: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
ef10: 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  ATA | PTF_LEAF.*
ef20: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
ef30: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
ef40: 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  KEY.**         P
ef50: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ef60: 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c  F_INTKEY | PTF_L
ef70: 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EAF.*/.static in
ef80: 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  t decodeFlags(Me
ef90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
efa0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
efb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
efc0: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
efd0: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
efe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
eff0: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
f000: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
f010: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
f020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f030: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f040: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
f050: 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28  ge->leaf = (u8)(
f060: 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61  flagByte>>3);  a
f070: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
f080: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
f090: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
f0a0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
f0b0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
f0c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
f0d0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f0e0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20  = cellSizePtr;. 
f0f0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
f100: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
f110: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
f120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
f130: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f140: 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35  E-OF: R-07291-35
f150: 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35  328 A value of 5
f160: 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68   (0x05) means th
f170: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
f180: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62   ** interior tab
f190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
f1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f1e0: 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36  F: R-26900-09176
f1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28   A value of 13 (
f200: 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0d) means the 
f210: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f220: 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72   leaf table b-tr
f230: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f240: 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41  assert( (PTF_LEA
f250: 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59  FDATA|PTF_INTKEY
f260: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29  |PTF_LEAF)==13 )
f270: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f280: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Key = 1;.    if(
f290: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
f2a0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f2b0: 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20  KeyLeaf = 1;.   
f2c0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f2d0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f2e0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
f2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
f300: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f310: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
f320: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
f330: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
f340: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
f350: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
f360: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
f370: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
f380: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f390: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
f3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
f3b0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
f3c0: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
f3d0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
f3e0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
f3f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f400: 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76  -43316-37308 A v
f410: 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29  alue of 2 (0x02)
f420: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f430: 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74  is an.    ** int
f440: 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  erior index b-tr
f450: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f460: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
f470: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
f480: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f490: 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41   R-59615-42828 A
f4a0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78   value of 10 (0x
f4b0: 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0a) means the pa
f4c0: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f4d0: 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65  eaf index b-tree
f4e0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f4f0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f500: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
f510: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
f520: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
f530: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
f540: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
f550: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f560: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f570: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
f580: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
f590: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
f5a0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f5b0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
f5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
f5d0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5e0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
f5f0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
f600: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
f610: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
f620: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
f630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f640: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
f650: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
f660: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
f670: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
f680: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
f690: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f6a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
f6b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
f6c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
f6d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
f6e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f6f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
f700: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
f710: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
f720: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
f730: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
f740: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
f750: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
f760: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
f770: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
f780: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
f790: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
f7a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f7b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
f7c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
f7d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
f7e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
f7f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
f800: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
f810: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
f820: 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
f830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f840: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
f850: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
f860: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
f870: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f880: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
f890: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
f8a0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
f8b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f8c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f8d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
f8e0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f8f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f900: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f910: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
f920: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
f930: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
f940: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
f950: 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
f960: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
f970: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
f980: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
f990: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
f9a0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f9b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f9c0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f9d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
f9e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f9f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
fa00: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
fa10: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
fa20: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
fa30: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
fa40: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
fa50: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
fa60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
fa70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
fa80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
fa90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
faa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
fab0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
fac0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fad0: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
fae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
faf0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
fb00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
fb10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
fb20: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
fb30: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
fb40: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
fb50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
fb60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fb70: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fb80: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fb90: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
fba0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
fbb0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fbc0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
fbd0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
fbe0: 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
fbf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
fc00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
fc10: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
fc20: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc30: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
fc40: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
fc50: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
fc60: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
fc70: 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
fc80: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
fc90: 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
fca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
fcb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
fcc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fcd0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
fce0: 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
fcf0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
fd00: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
fd10: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
fd20: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
fd30: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
fd40: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
fd50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
fd60: 77 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53  w = 0;.  usableS
fd70: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
fd80: 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  eSize;.  pPage->
fd90: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
fda0: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
fdb0: 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
fdc0: 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  PtrSize;.  pPage
fdd0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
fde0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
fdf0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
fe00: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
fe10: 66 73 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  fset];.  pPage->
fe20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
fe30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
fe40: 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49  rSize];.  /* EVI
fe50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
fe60: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
fe70: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
fe80: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
fe90: 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  tes.  ** the sta
fea0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
feb0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
fec0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
fed0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
fee0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
fef0: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f  s 65536. */.  to
ff00: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ff10: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ff20: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
ff30: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
ff40: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
ff50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
ff60: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
ff70: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
ff80: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
ff90: 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  */.  pPage->nCel
ffa0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
ffb0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
ffc0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ffd0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ffe0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
fff0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
10000 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
10010 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
10020 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10030 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10040 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
10050 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
10060 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
10070 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56  (pBt) );.  /* EV
10080 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
10090 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
100a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
100b0 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
100c0 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c  nly.  ** possibl
100d0 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
100e0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
100f0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
10100 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  ws) then the.  *
10110 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * offset to the 
10120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
10130 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65  a will equal the
10140 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73   page size minus
10150 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20   the.  ** bytes 
10160 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
10170 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
10180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
10190 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
101a0 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
101b0 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  );..  /* A malfo
101c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
101d0 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
101e0 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
101f0 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70  he end.  ** of p
10200 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
10210 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a   a cell.  .  **.
10220 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
10230 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
10240 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
10250 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
10260 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74  xtends.  ** past
10270 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
10280 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
10290 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
102a0 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a  RRUPT to be .  *
102b0 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
102c0 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43   does..  */.  iC
102d0 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
102e0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
102f0 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  >nCell;.  iCellL
10300 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
10310 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d   - 4;.  if( pBt-
10320 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
10330 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
10340 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
10350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10360 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
10370 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
10380 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
10390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
103a0 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
103b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
103c0 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
103d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
103e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
103f0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65  ){.      pc = ge
10400 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
10410 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
10420 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  *2]);.      test
10430 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
10440 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65  irst );.      te
10450 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
10460 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69  lLast );.      i
10470 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10480 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
10490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
104a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
104b0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
104c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
104d0 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
104e0 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
104f0 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  pc]);.      test
10500 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
10510 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
10520 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
10530 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
10540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10550 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10560 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10570 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
10580 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10590 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  st++;.  }  ..  /
105a0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
105b0 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
105c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
105d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
105e0 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
105f0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10600 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10610 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
10620 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
10630 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
10640 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
10650 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
10660 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
10670 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
10680 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
10690 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
106a0 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
106b0 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
106c0 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
106d0 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
106e0 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  if( pc>0 ){.    
106f0 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
10700 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10710 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f  First ){.      /
10720 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10730 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10740 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
10750 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
10760 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   will.      ** a
10770 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73  lways be at leas
10780 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72  t one cell befor
10790 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  e the first free
107a0 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  block..      */.
107b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
107c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
107d0 28 70 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a  (pPage); .    }.
107e0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
107f0 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10800 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10810 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f    /* Freeblock o
10820 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
10830 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
10840 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10850 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10860 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10870 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
10880 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
10890 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
108a0 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
108b0 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d  );.      nFree =
108c0 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
108d0 20 20 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70       if( next<=p
108e0 63 2b 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b  c+size+3 ) break
108f0 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
10900 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
10910 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20   next>0 ){.     
10920 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10930 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10940 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rder */.      re
10950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10960 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
10970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10980 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64  c+size>(unsigned
10990 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20   int)usableSize 
109a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74  ){.      /* Last
109b0 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e   freeblock exten
109c0 64 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64  ds past page end
109d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
109e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
109f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10a00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
10a10 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
10a20 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
10a30 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
10a40 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
10a50 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
10a60 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
10a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10a80 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
10a90 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
10aa0 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10ab0 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10ac0 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10ad0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
10ae0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
10af0 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
10b00 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
10b10 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
10b20 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
10b30 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
10b40 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10b50 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
10b60 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
10b70 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
10b80 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
10b90 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
10ba0 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
10bb0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10bd0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10be0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  e);.  }.  pPage-
10bf0 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
10c00 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
10c10 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  t);.  pPage->isI
10c20 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
10c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10c40 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
10c50 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
10c60 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
10c70 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
10c80 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
10c90 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
10ca0 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
10cb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
10cc0 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
10cd0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
10ce0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
10cf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10d00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
10d10 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10d20 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10d30 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10d40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10d50 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10d60 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10d70 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10d80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10d90 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10da0 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10db0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
10dc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
10dd0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
10de0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
10df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10e00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
10e10 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10e20 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10e30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10e40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10e50 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10e60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
10e70 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
10e80 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10e90 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10ea0 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
10eb0 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
10ec0 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
10ed0 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
10ee0 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
10ef0 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
10f00 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10f10 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10f20 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10f30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10f40 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10f60 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f70 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10f80 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10f90 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10fa0 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
10fb0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
10fc0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
10fd0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
10fe0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
10ff0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
11000 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
11010 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
11020 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
11030 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11040 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
11050 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
11060 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
11070 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
11080 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
11090 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
110a0 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
110b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
110c0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
110d0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
110e0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
110f0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
11100 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
11110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
11120 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
11130 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
11140 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
11150 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
11160 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11170 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
11180 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
11190 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
111a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
111b0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
111c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
111d0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
111e0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
111f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
11200 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
11210 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11220 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
11230 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
11240 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
11250 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
11260 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
11270 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
11280 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
11290 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
112a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
112b0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
112c0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
112d0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
112e0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
112f0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11300 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
11310 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
11320 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
11330 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
11340 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
11350 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
11360 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
11370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
11380 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
11390 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
113a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
113b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
113c0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
113d0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
113e0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
113f0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
11400 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
11410 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
11420 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
11430 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
11440 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
11450 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
11460 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
11470 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
11480 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
11490 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
114a0 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
114b0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
114c0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
114d0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
114e0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
114f0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
11500 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
11510 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11520 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
11530 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
11540 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
11550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
11560 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11570 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11580 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
11590 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
115a0 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
115b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
115c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
115d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
115e0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
115f0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11600 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
11610 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
11620 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
11630 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
11640 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
11650 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11660 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
11670 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11680 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
116a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
116b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
116c0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
116d0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
116e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
116f0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
11700 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
11710 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
11720 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
11730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11740 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
11750 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
11760 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
11770 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
11780 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
11790 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
117a0 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
117b0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
117c0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
117d0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
117e0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
117f0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
11800 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11810 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
11820 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
11830 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
11840 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
11850 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11860 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11870 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
11880 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
11890 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
118a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
118b0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
118c0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
118d0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
118e0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
118f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
11920 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
11930 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
11940 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
11950 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
11960 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
11970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
11980 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
11990 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
119a0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
119b0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
119c0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
119d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
119e0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
119f0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
11a00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
11a10 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
11a20 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  0000000)==0 );. 
11a30 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
11a40 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
11a50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
11a60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11a70 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
11a80 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  e it..**.** If p
11a90 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Cur!=0 then the 
11aa0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65  page is being fe
11ab0 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66  tched as part of
11ac0 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
11ad0 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64  .** call.  Do ad
11ae0 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20  ditional sanity 
11af0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
11b00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
11b10 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  e..** And if the
11b20 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68   fetch fails, th
11b30 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
11b40 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e  decrement pCur->
11b50 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iPage..**.** The
11b60 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64   page is fetched
11b70 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75   as read-write u
11b80 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f  nless pCur is no
11b90 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a  t NULL and is.**
11ba0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
11bb0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  sor..**.** If an
11bc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11bd0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75  hen *ppPage is u
11be0 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20  ndefined. It.** 
11bf0 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  may remain uncha
11c00 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20  nged, or it may 
11c10 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76  be set to an inv
11c20 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  alid value..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
11c40 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
11c50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11c80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11cb0 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
11cc0 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
11cd0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
11ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
11cf0 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
11d00 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75  r here */.  BtCu
11d10 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
11d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
11d30 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65  ursor to receive
11d40 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55   the page, or NU
11d50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  LL */.  int bRea
11d60 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  dOnly           
11d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11d80 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
11d90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
11da0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11db0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
11dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11dd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11df0 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d  ur==0 || ppPage=
11e00 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  =&pCur->pPage );
11e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11e20 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
11e30 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
11e40 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
11e50 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
11e60 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
11e70 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
11e80 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
11e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11ea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11eb0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11ec0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11ed0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11ee0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
11ef0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
11f00 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11f10 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11f20 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11f30 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11f40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11f50 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11f60 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11f70 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11f80 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11f90 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11fa0 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
11fb0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11fc0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
11fd0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
11fe0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11ff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12000 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
12010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12020 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
12030 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
12040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
12050 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
12060 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
12070 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12080 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
12090 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
120a0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
120b0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
120c0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
120d0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
120e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
120f0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
12100 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
12110 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
12120 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
12130 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
12140 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
12150 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
12160 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
12170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12180 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
12190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
121a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f  *ppPage);.    go
121b0 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
121c0 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
121d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
121e0 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
121f0 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43  _error:.  if( pC
12200 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ur ){.    pCur->
12210 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75  iPage--;.    pCu
12220 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
12230 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
12240 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age];.  }.  test
12250 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12260 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12270 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12280 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
122a0 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
122b0 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
122c0 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
122d0 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
122e0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
122f0 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
12300 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
12310 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
12320 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
12330 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
12340 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12350 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
12360 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
12370 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
12380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
12390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
123a0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
123b0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
123c0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
123d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
123e0 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
123f0 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
12400 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
12410 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12420 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
12430 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
12440 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12460 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12470 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12480 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
12490 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
124a0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
124b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
124c0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
124d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
124e0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
124f0 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
12500 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12510 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
12520 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12530 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
12540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12550 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12560 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12580 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
12590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
125a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
125b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
125c0 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
125d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
125e0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
125f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12600 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
12610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12630 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
12640 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
12650 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
12660 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
12680 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
12690 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
126a0 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
126b0 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
126c0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
126d0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
126e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
126f0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
12700 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
12710 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
12720 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
12730 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
12740 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
12750 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
12760 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
12770 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
12780 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
12790 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
127a0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
127b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
127c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
127d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
127e0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
127f0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
12800 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
12810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12820 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
12830 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
12840 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12850 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12860 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12870 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12880 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12890 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
128a0 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
128b0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
128c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
128d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
128e0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
128f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
12900 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
12910 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12920 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
12930 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
12940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12960 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12970 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12980 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12990 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
129a0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
129b0 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
129c0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
129d0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
129e0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
129f0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
12a00 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
12a10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12a20 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
12a30 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
12a40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12a50 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12a60 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12a70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12a90 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12aa0 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12ab0 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12ac0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12ad0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12ae0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
12af0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
12b00 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
12b10 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
12b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
12b30 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
12b40 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12b50 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12b60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b70 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12b80 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12b90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12ba0 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12bc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12bd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12be0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
12bf0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12c00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12c10 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
12c20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
12c30 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
12c40 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12c50 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12c60 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12c70 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12c80 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12c90 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12ca0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12cb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12cc0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12cd0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12ce0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12cf0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
12d00 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
12d10 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
12d20 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
12d30 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
12d40 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12d50 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12d60 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12d70 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12d80 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12d90 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12da0 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12db0 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12dc0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12dd0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12de0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
12df0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12e00 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
12e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12e20 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
12e30 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
12e40 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12e50 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12e60 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12e70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12e80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12e90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12ea0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12eb0 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12ec0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12ed0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12ee0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
12ef0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
12f00 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
12f10 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
12f20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12f30 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
12f40 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12f50 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12f60 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12f70 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12f80 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12f90 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12fa0 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12fb0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12fc0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12fd0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12fe0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
12ff0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13000 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
13010 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
13020 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
13030 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
13040 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
13050 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
13060 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
13070 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
13080 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
13090 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
130a0 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
130b0 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
130c0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
130d0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
130e0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
130f0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
13100 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
13110 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
13120 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
13130 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
13140 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
13150 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
13160 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13170 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
13180 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
13190 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
131a0 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
131b0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
131c0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
131d0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
131e0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
131f0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
13200 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
13210 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
13220 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
13230 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
13240 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
13250 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
13260 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13270 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
13280 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13290 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
132a0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
132b0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
132c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
132d0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
132e0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
132f0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
13300 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
13310 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
13320 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
13330 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13340 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
13350 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
13360 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
13370 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
13380 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
13390 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
133a0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
133b0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
133c0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
133d0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
133e0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
133f0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
13400 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
13410 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
13420 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
13430 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
13440 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
13450 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
13460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13470 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
13480 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13490 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
134a0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
134b0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
134c0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
134d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
134e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
134f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13500 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
13510 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
13520 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
13530 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
13540 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
13550 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
13560 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
13570 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
13580 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
13590 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
135a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
135b0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
135c0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
135d0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
135e0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
135f0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
13600 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
13610 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
13620 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
13630 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
13640 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13650 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
13660 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
13670 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
13680 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13690 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
136a0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
136b0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
136c0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
136d0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
136e0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
136f0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
13700 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13710 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
13720 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
13730 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
13740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13750 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
13760 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13770 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
13780 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
13790 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
137a0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
137b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
137c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
137d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
137e0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
137f0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
13800 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
13810 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
13820 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
13830 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
13840 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
13850 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13860 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13870 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13880 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13890 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
138a0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
138b0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
138c0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
138d0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
138e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
138f0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
13900 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
13910 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
13920 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
13930 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
13940 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
13950 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13960 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13970 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13980 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13990 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
139a0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
139b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
139c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
139d0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
139e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
139f0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
13a00 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
13a10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13a20 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
13a30 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13a40 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
13a50 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
13a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13a70 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
13a80 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
13a90 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
13aa0 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
13ab0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13ac0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13ad0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13ae0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
13af0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
13b00 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
13b10 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
13b20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
13b30 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
13b40 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
13b50 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
13b60 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
13b70 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
13b80 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
13b90 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
13ba0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
13bb0 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
13bc0 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
13bd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13be0 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
13bf0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
13c00 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13c10 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
13c20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
13c30 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
13c40 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
13c50 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
13c60 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
13c70 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
13c80 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
13c90 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
13ca0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13cb0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13cc0 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
13cd0 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13ce0 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
13cf0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
13d00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13d10 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
13d20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
13d30 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
13d40 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
13d50 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13d60 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
13d70 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
13d80 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
13d90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13da0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13db0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13dc0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
13df0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
13e00 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13e10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13e30 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13e40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13e50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13e60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13e70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13e80 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
13e90 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
13ea0 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
13eb0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13ec0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13ed0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
13ee0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13ef0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
13f00 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
13f10 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
13f20 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13f30 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
13f40 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
13f50 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13f60 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
13f70 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
13f80 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
13f90 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13fa0 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
13fb0 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
13fc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13fd0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
13fe0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
13ff0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
14000 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
14010 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
14020 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
14030 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
14040 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
14050 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
14060 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
14070 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
14080 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
14090 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
140a0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
140b0 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
140c0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
140d0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
140e0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
140f0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
14100 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
14110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14120 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14130 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14150 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14160 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
14170 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14180 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
14190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
141a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
141b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
141c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
141d0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
141e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
141f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
14200 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
14210 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
14220 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
14230 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14250 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14260 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14280 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
14290 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
142a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
142b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
142c0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
142d0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
142e0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
142f0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
14300 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
14310 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
14320 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
14330 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
14340 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
14350 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
14360 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
14370 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
14380 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
14390 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
143a0 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
143b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
143c0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
143d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
143e0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
143f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
14400 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
14410 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
14420 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
14430 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
14440 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
14450 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
14460 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
14470 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
14480 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
14490 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
144a0 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
144b0 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
144c0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
144d0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
144e0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
144f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14500 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
14510 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
14520 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
14530 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
14540 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
14550 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
14560 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
14570 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
14580 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
14590 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
145a0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
145b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
145c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
145d0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
145e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
145f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
14600 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
14610 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
14620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14630 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
14640 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
14650 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
14660 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
14670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14680 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14690 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
146a0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
146b0 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
146c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
146d0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
146e0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
146f0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
14700 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
14710 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
14720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14730 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14740 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
14750 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
14760 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
14770 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
14780 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
14790 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
147a0 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
147b0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
147c0 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
147d0 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
147e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
147f0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
14800 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
14810 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
14820 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
14830 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
14840 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
14850 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65  ONLY;.#if define
14860 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  d(SQLITE_SECURE_
14870 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
14880 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14890 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
148a0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
148b0 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45  LITE_FAST_SECURE
148c0 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
148d0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
148e0 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e  S_OVERWRITE;.#en
148f0 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  dif.    /* EVIDE
14900 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
14910 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
14920 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
14930 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
14940 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
14950 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
14960 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
14970 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
14980 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
14990 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
149a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
149b0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  le. */.    pBt->
149c0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
149d0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
149e0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
149f0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
14a00 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
14a10 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
14a20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14a30 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
14a40 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
14a50 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
14a60 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
14a70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
14a80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14a90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14aa0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
14ab0 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
14ac0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
14ad0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
14ae0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
14af0 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
14b00 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
14b10 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
14b20 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
14b30 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
14b40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14b50 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
14b60 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
14b70 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
14b80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
14b90 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
14ba0 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
14bb0 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
14bc0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
14bd0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
14be0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
14bf0 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
14c00 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
14c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14c20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
14c30 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
14c40 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
14c50 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
14c60 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
14c70 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
14c80 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
14c90 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
14ca0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14cb0 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
14cc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14cd0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
14ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14cf0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
14d00 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
14d10 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
14d20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
14d30 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  is.      ** dete
14d40 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
14d50 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
14d60 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
14d70 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
14d80 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
14d90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14da0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
14db0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
14dc0 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
14dd0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14de0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
14df0 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
14e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14e10 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
14e20 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
14e30 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
14e40 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
14e50 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
14e60 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
14e70 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
14e80 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
14e90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
14ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14eb0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14ec0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
14ed0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
14ee0 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
14ef0 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
14f00 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
14f10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
14f20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14f30 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
14f40 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
14f50 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
14f60 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
14f70 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
14f80 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
14f90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14fa0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14fb0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14fc0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14fd0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
14fe0 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
14ff0 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
15000 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
15010 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
15020 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
15030 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  1;.    if( p->sh
15040 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
15050 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
15060 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
15070 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
15080 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
15090 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
150a0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
150b0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
150c0 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
150d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
150e0 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
150f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
15100 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
15110 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
15120 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15130 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15140 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
15150 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
15160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
15170 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15180 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
15190 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
151b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
151c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
151d0 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
151e0 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
151f0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
15200 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15210 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
15220 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
15230 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15240 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
15250 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
15260 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
15270 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
15280 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
15290 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
152a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
152b0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
152c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
152d0 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
152e0 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
152f0 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
15300 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
15310 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
15320 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
15330 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
15340 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
15350 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
15360 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
15370 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
15380 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
15390 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
153a0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
153b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
153c0 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
153d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
153e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
153f0 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
15400 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
15410 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
15420 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
15430 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
15440 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
15450 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
15460 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e     if( (uptr)p->
15470 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e  pBt<(uptr)pSib->
15480 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
15490 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
154a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
154b0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
154c0 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
154d0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
154e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
154f0 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
15500 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e   && (uptr)pSib->
15510 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72  pNext->pBt<(uptr
15520 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  )p->pBt ){.     
15530 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
15540 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
15550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15560 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
15570 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
15580 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
15590 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
155a0 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
155b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
155c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
155d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155e0 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
155f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
15600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15620 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
15630 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
15640 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
15650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15660 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
15670 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
15680 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15690 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
156a0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
156b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
156c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
156d0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
156e0 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
156f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
15700 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20  file *pFile;..  
15710 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
15720 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
15730 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
15740 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
15750 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
15760 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
15770 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
15780 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
15790 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
157a0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
157b0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
157c0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
157d0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
157e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
157f0 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
15800 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15810 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
15820 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
15830 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
15840 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
15850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c  .    }..    pFil
15860 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
15870 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
15880 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
15890 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
158a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
158b0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
158c0 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  le, SQLITE_FCNTL
158d0 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42  _PDB, (void*)&pB
158e0 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  t->db);.    }.  
158f0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
15900 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
15910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15920 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
15930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
15940 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
15950 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pen);.  }.  asse
15960 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
15970 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  K || sqlite3Btre
15980 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74  eConnectionCount
15990 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a  (*ppBtree)>0 );.
159a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
159b0 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
159c0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
159d0 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
159e0 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
159f0 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
15a00 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
15a10 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
15a20 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
15a30 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
15a40 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
15a50 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
15a60 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
15a70 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
15a80 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
15a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15aa0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
15ab0 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
15ac0 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
15ad0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15ae0 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
15af0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
15b00 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
15b10 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
15b20 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
15b30 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
15b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
15b50 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
15b60 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
15b70 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15b80 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b90 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15ba0 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15bb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15bc0 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15bd0 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
15be0 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
15bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
15c00 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
15c10 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
15c20 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
15c30 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
15c40 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15c50 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
15c60 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
15c70 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
15c80 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
15c90 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15ca0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
15cb0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
15cc0 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
15cd0 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
15ce0 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
15cf0 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
15d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
15d10 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
15d20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
15d30 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
15d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15d50 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
15d60 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
15d70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15d80 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
15d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
15da0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
15db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15dc0 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
15dd0 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
15de0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
15df0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15e00 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
15e10 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
15e20 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
15e30 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
15e40 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
15e50 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
15e60 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
15e70 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
15e80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
15e90 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
15ea0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
15eb0 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
15ec0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15ed0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15ee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
15ef0 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
15f00 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
15f10 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
15f20 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
15f30 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
15f40 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
15f50 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
15f60 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
15f70 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
15f80 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
15f90 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
15fa0 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
15fb0 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
15fc0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
15fd0 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
15fe0 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
15ff0 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
16000 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
16010 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
16020 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
16030 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
16040 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
16050 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
16060 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
16070 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
16080 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16090 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
160a0 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
160b0 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
160c0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
160d0 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
160e0 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
160f0 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
16100 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
16110 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
16120 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
16130 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
16140 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
16150 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
16160 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
16170 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
16180 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
16190 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
161a0 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
161b0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
161c0 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
161d0 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
161e0 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
161f0 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
16200 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
16210 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
16220 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
16230 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
16240 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
16250 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
16260 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
16270 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
16280 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
16290 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
162a0 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
162b0 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
162c0 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
162d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
162e0 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
162f0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
16300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16310 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
16320 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
16330 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
16340 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
16350 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
16360 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
16370 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
16380 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
16390 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
163a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
163b0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
163c0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
163d0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
163e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
163f0 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
16400 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16410 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
16420 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
16430 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
16440 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
16450 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
16460 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16470 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16480 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16490 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
164a0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
164b0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
164c0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
164d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
164e0 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
164f0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
16500 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
16510 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
16520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
16530 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
16540 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16550 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
16560 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
16570 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
16580 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
16590 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
165a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
165b0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
165c0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
165d0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
165e0 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
165f0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
16600 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
16610 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
16620 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
16630 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
16640 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
16650 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16660 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
16670 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
16680 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
16690 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
166a0 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
166b0 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
166c0 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
166d0 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
166e0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
166f0 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
16700 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
16710 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
16720 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
16730 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
16740 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
16750 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
16760 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
16770 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
16780 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
16790 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
167a0 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
167b0 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
167c0 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
167d0 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
167e0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
167f0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
16800 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
16810 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
16820 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29  ->pPager, p->db)
16830 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
16840 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
16850 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
16860 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
16870 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
16880 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
16890 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
168a0 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
168b0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
168c0 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
168d0 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
168e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
168f0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16900 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
16910 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
16920 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
16930 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
16940 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
16950 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
16960 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
16970 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
16980 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
16990 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
169a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
169b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
169d0 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
169e0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
169f0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
16a00 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
16a10 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
16a20 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
16a30 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
16a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
16a50 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
16a60 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
16a70 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
16a80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16a90 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
16aa0 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
16ab0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
16ac0 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
16ad0 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
16ae0 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
16af0 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
16b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16b10 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
16b20 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
16b30 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
16b40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16b70 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
16b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16b90 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
16ba0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
16bb0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
16bc0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16bd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16bf0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
16c00 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
16c10 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
16c20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
16c30 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
16c40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16c50 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
16c60 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
16c70 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
16c80 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
16c90 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
16ca0 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
16cb0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
16cc0 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
16cd0 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
16ce0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
16cf0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
16d00 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
16d10 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
16d20 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
16d30 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
16d40 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
16d50 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
16d60 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
16d70 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
16d80 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
16d90 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
16da0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
16db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16dc0 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
16dd0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
16de0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
16df0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16e00 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
16e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16e20 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16e30 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16e40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16e50 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
16e60 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
16e70 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
16e80 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16e90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16ea0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
16eb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16ec0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
16ed0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
16ee0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
16ef0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16f00 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
16f10 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
16f20 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16f30 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
16f40 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
16f50 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
16f60 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
16f70 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16f90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16fa0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16fb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16fc0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16fd0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
16fe0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
16ff0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
17000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17020 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
17030 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
17040 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
17050 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
17060 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
17070 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
17080 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
17090 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
170a0 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
170b0 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
170c0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
170d0 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
170e0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
170f0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
17100 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
17110 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
17120 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
17130 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
17140 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
17150 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
17160 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
17170 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
17180 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
17190 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
171a0 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
171b0 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
171c0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
171d0 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
171e0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
171f0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
17200 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
17210 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
17220 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
17230 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
17240 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
17250 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17260 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
17270 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
17280 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
17290 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
172a0 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
172b0 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
172c0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
172d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
172e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
172f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
17300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
17310 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17320 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
17330 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
17340 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
17350 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17360 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17380 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
17390 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
173a0 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
173b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
173c0 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
173d0 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
173e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
173f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
17400 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
17410 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
17420 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
17430 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
17440 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
17450 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
17460 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
17470 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
17480 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
17490 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
174a0 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
174b0 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
174c0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
174d0 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
174e0 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
174f0 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
17500 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
17510 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
17520 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
17530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17540 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
17550 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
17560 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
17570 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
17580 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
17590 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
175a0 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
175b0 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
175c0 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
175d0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
175e0 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
175f0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
17600 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
17610 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
17620 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
17630 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
17640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
17650 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
17660 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17670 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
17680 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
17690 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
176a0 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
176b0 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
176c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
176d0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
176e0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
176f0 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
17700 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
17710 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
17720 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
17730 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17740 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
17750 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
17760 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17770 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17780 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
17790 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
177a0 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
177b0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
177c0 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
177d0 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
177e0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
177f0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
17800 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17810 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
17820 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17840 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
17850 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
17860 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
17870 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
17880 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
17890 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
178a0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
178b0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
178c0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
178d0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
178e0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
178f0 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
17900 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
17910 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
17920 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
17930 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
17940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17950 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
17960 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
17970 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
17980 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
17990 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
179a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
179b0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
179c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
179d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
179e0 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
179f0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
17a00 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
17a10 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
17a20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
17a30 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
17a40 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
17a50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17a60 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17a80 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
17a90 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
17aa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17ab0 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
17ac0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
17ad0 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
17ae0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
17af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17b00 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
17b10 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
17b20 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
17b30 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
17b40 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
17b50 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
17b60 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
17b70 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
17b80 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
17b90 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
17ba0 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
17bb0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
17bc0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
17bd0 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
17be0 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
17bf0 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
17c00 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
17c10 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
17c20 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17c30 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
17c40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
17c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17c60 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
17c70 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
17c80 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
17c90 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
17ca0 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
17cb0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17cc0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
17cd0 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
17ce0 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
17cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
17d00 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
17d10 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
17d20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
17d30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17d40 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
17d50 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
17d60 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
17d70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
17d80 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
17d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
17da0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
17db0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
17dc0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
17dd0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
17de0 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
17df0 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
17e00 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
17e10 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
17e20 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
17e30 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
17e40 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
17e50 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
17e60 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
17e70 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
17e80 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
17e90 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
17ea0 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
17eb0 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
17ec0 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
17ed0 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
17ee0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
17ef0 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
17f00 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
17f10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17f20 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
17f30 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
17f40 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
17f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
17f60 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
17f70 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
17f80 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
17f90 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17fa0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
17fb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17fc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
17fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
17fe0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17ff0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
18000 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
18010 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
18020 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
18030 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
18040 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
18050 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
18060 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
18070 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
18080 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
18090 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
180a0 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
180b0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
180c0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
180d0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
180e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
180f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
18100 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
18110 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
18120 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18130 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18140 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18150 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
18160 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45  s for the BTS_SE
18170 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20  CURE_DELETE and 
18180 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c  BTS_OVERWRITE fl
18190 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65  ags:.**.**    ne
181a0 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42  wFlag==0       B
181b0 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  oth BTS_SECURE_D
181c0 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
181d0 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61  ERWRITE are clea
181e0 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  red.**    newFla
181f0 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53  g==1       BTS_S
18200 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74  ECURE_DELETE set
18210 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
18220 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a  TE is cleared.**
18230 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20      newFlag==2  
18240 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
18250 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61  DELETE cleared a
18260 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  nd BTS_OVERWRITE
18270 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65   is set.**    ne
18280 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e  wFlag==(-1)    N
18290 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20  o changes.**.** 
182a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
182b0 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20  s as a query if 
182c0 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20  newFlag is less 
182d0 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20  than zero.**.** 
182e0 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49  With BTS_OVERWRI
182f0 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20  TE set, deleted 
18300 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77  content is overw
18310 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c  ritten by zeros,
18320 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74   but.** freelist
18330 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
18340 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b  not written back
18350 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18360 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a  .  Thus in-page.
18370 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  ** deleted conte
18380 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62  nt is cleared, b
18390 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65  ut freelist dele
183a0 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ted content is n
183b0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ot..**.** With B
183c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
183d0 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c  , operation is l
183e0 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ike BTS_OVERWRIT
183f0 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  E with the addit
18400 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65  ion.** that free
18410 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
18420 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b  are written back
18430 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18440 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a  se, increasing.*
18450 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  * the amount of 
18460 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74  disk I/O..*/.int
18470 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
18480 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
18490 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
184a0 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
184b0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
184c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
184d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
184e0 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54  rt( BTS_OVERWRIT
184f0 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45  E==BTS_SECURE_DE
18500 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65  LETE*2 );.  asse
18510 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43  rt( BTS_FAST_SEC
18520 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52  URE==(BTS_OVERWR
18530 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44  ITE|BTS_SECURE_D
18540 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20  ELETE) );.  if( 
18550 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
18560 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
18570 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f  gs &= ~BTS_FAST_
18580 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70  SECURE;.    p->p
18590 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
185a0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
185b0 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20  E*newFlag;.  }. 
185c0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
185d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
185e0 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45  T_SECURE)/BTS_SE
185f0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73  CURE_DELETE;.  s
18600 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18610 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
18620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
18630 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
18640 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
18650 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
18660 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
18670 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
18680 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
18690 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
186a0 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
186b0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
186c0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
186d0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
186e0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
186f0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
18700 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18710 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18720 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
18730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18740 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
18750 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
18760 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
18770 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18780 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18790 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
187a0 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
187b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
187c0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
187d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
187e0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
187f0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
18800 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18810 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
18820 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
18830 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
18840 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
18850 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
18860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
18870 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
18880 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18890 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
188a0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
188b0 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
188c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
188d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
188e0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
188f0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
18900 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
18910 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
18920 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
18930 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
18940 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
18950 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18960 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
18970 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
18980 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
18990 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
189a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
189b0 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
189c0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
189d0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
189e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
189f0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
18a00 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
18a10 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
18a20 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
18a30 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
18a40 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
18a50 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
18a60 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
18a70 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
18a80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18a90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18aa0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
18ab0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  /*.** If the use
18ac0 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68  r has not set th
18ad0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66  e safety-level f
18ae0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
18af0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75   connection.** u
18b00 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e  sing "PRAGMA syn
18b10 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69  chronous", and i
18b20 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  f the safety-lev
18b30 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  el is not alread
18b40 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20  y.** set to the 
18b50 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
18b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
18b70 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
18b80 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74  meter,.** set it
18b90 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   so..*/.#if SQLI
18ba0 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
18bb0 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
18bc0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18bd0 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20  RONOUS \.    && 
18be0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
18bf0 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63  OMIT_WAL).static
18c00 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74   void setDefault
18c10 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65  SyncFlag(BtShare
18c20 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74  d *pBt, u8 safet
18c30 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69  y_level){.  sqli
18c40 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70  te3 *db;.  Db *p
18c50 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42  Db;.  if( (db=pB
18c60 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
18c70 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
18c80 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d  .    while( pDb-
18c90 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e  >pBt==0 || pDb->
18ca0 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b  pBt->pBt!=pBt ){
18cb0 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66   pDb++; }.    if
18cc0 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d  ( pDb->bSyncSet=
18cd0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d  =0 .     && pDb-
18ce0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73  >safety_level!=s
18cf0 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20  afety_level .   
18d00 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61    && pDb!=&db->a
18d10 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20  Db[1] .    ){.  
18d20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
18d30 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c  level = safety_l
18d40 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  evel;.      sqli
18d50 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
18d60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20  (pBt->pPager,.  
18d70 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
18d80 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
18d90 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
18da0 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
18db0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
18dc0 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75   define setDefau
18dd0 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73  ltSyncFlag(pBt,s
18de0 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e  afety_level).#en
18df0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  dif../*.** Get a
18e00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
18e10 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
18e20 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
18e30 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
18e40 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
18e50 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
18e60 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
18e70 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
18e80 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
18e90 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
18ea0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
18eb0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
18ec0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
18ed0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
18ee0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
18ef0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
18f00 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
18f10 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
18f20 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
18f30 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
18f40 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
18f50 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
18f60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18f70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
18f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
18f90 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
18fa0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
18fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
18fc0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
18fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18fe0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
18ff0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19000 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19010 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
19020 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
19030 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
19040 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
19050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19060 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
19070 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
19080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
190a0 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
190b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
190c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
190d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
190e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
190f0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
19100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
19110 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
19120 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
19130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19140 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
19150 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
19160 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
19170 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19180 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19190 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
191a0 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
191b0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
191c0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
191d0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
191e0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
191f0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
19200 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
19210 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
19220 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
19230 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
19240 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
19250 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
19260 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
19270 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
19280 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19290 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
192a0 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
192b0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
192c0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
192d0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
192e0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
192f0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
19300 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
19310 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
19320 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19330 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
19340 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19350 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
19360 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
19370 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
19380 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
19390 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
193a0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
193b0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
193c0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
193d0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
193e0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
193f0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
19400 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19410 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
19420 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19430 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
19440 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19450 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
19460 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
19470 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
19480 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
19490 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
194a0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
194b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
194c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
194d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
194e0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
194f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
19500 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
19510 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
19520 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
19530 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19540 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19550 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19560 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
19570 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
19580 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
19590 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
195a0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
195b0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
195c0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
195d0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
195e0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
195f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19600 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19610 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19620 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19630 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19640 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19650 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19660 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19670 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19680 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19690 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
196a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
196b0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
196c0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
196d0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
196e0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
196f0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
19700 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19710 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19720 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
19730 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
19740 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
19750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
19760 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
19770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19780 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
19790 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
197a0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
197b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
197c0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
197d0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
197e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
197f0 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19800 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19810 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
19820 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
19830 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
19840 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
19850 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
19860 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19880 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
19890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
198a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
198b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
198c0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
198d0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
198e0 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
198f0 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a  ONOUS+1);.    }.
19900 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
19910 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
19920 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
19930 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
19940 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
19950 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
19960 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
19970 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
19980 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
19990 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
199a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
199b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
199c0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
199d0 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
199e0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
199f0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
19a00 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
19a10 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
19a20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
19a30 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
19a40 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
19a50 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
19a60 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19a70 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
19a80 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19a90 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
19aa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
19ab0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19ac0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19ad0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
19ae0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
19af0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
19b00 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
19b10 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
19b20 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
19b30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19b40 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
19b50 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
19b60 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
19b70 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19b80 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
19b90 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
19ba0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
19bb0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
19bc0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
19bd0 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
19be0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
19bf0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
19c00 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
19c10 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
19c20 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
19c30 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
19c40 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
19c50 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19c60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19c70 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
19c80 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
19c90 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19ca0 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
19cb0 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
19cc0 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
19cd0 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
19ce0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
19cf0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
19d00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
19d10 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
19d20 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
19d30 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
19d40 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
19d50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
19d60 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
19d70 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
19d80 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
19d90 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
19da0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
19db0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
19dc0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
19dd0 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
19de0 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
19df0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19e00 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
19e10 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
19e20 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
19e30 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
19e40 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
19e50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
19e60 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
19e70 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
19e80 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
19e90 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
19ea0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
19eb0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
19ec0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
19ed0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
19ee0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
19ef0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
19f00 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
19f10 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
19f20 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
19f30 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
19f40 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
19f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
19f60 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
19f70 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
19f80 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
19f90 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
19fa0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
19fb0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
19fc0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
19fd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
19fe0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19ff0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
1a000 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
1a010 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
1a020 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
1a030 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a040 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
1a050 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
1a060 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
1a070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
1a0a0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
1a0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a0c0 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
1a0d0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1a0e0 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
1a0f0 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
1a100 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
1a110 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1a120 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
1a130 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a140 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a150 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a160 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
1a170 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
1a180 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
1a190 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
1a1a0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
1a1b0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1a1c0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
1a1d0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
1a1e0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
1a1f0 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
1a200 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
1a210 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
1a220 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
1a230 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a240 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a250 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
1a260 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a270 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1a280 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1a290 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a2a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a2b0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
1a2c0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1a2d0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
1a2e0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
1a2f0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
1a300 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1a310 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
1a320 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
1a330 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
1a340 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
1a350 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
1a360 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
1a370 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
1a380 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
1a390 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
1a3a0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
1a3b0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
1a3c0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
1a3d0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
1a3e0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
1a3f0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
1a400 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
1a410 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
1a420 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
1a430 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
1a440 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
1a450 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1a460 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
1a470 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
1a480 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
1a490 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
1a4a0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
1a4b0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
1a4c0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
1a4d0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
1a4e0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
1a4f0 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
1a500 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
1a510 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
1a520 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
1a530 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
1a540 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
1a550 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
1a560 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
1a570 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
1a580 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
1a590 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1a5a0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
1a5b0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
1a5c0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1a5d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a5e0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1a5f0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
1a600 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
1a610 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
1a620 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
1a630 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a640 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1a650 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
1a660 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
1a670 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
1a680 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
1a690 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
1a6a0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
1a6b0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
1a6c0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
1a6d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
1a6e0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
1a6f0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
1a700 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1a710 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
1a720 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1a730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a740 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
1a750 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
1a760 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1a770 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
1a780 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1a790 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
1a7a0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
1a7b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a7c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1a7d0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
1a7e0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1a7f0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1a800 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1a810 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1a820 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1a830 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
1a840 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
1a850 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
1a860 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
1a870 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
1a880 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
1a890 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
1a8a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1a8b0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1a8c0 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
1a8d0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
1a8e0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
1a8f0 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
1a900 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
1a910 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
1a920 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
1a930 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
1a940 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
1a950 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
1a960 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
1a970 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
1a980 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
1a990 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
1a9a0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
1a9b0 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1a9c0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1a9d0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1a9e0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1a9f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1aa00 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
1aa10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
1aa20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
1aa30 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
1aa40 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1aa50 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
1aa60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
1aa70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1aa80 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
1aa90 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
1aaa0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
1aab0 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
1aac0 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
1aad0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
1aae0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
1aaf0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
1ab00 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
1ab10 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
1ab20 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1ab30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1ab40 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
1ab50 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
1ab60 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
1ab70 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
1ab80 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
1ab90 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
1aba0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1abb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1abc0 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
1abd0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
1abe0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
1abf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ac00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ac10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ac20 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1ac30 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
1ac40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ac50 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
1ac60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
1ac70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ac80 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
1ac90 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
1aca0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1acb0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1acc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1acd0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
1ace0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1acf0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
1ad00 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
1ad10 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
1ad20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
1ad30 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
1ad40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1ad50 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
1ad60 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
1ad70 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
1ad80 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
1ad90 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
1ada0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
1adb0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
1adc0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
1add0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1ade0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
1adf0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
1ae00 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
1ae10 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
1ae20 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
1ae30 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1ae40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ae50 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1ae60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
1ae70 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
1ae80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ae90 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
1aea0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
1aeb0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
1aec0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
1aed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1aee0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
1aef0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1af00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1af10 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
1af20 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
1af30 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
1af40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1af50 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1af60 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
1af70 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
1af80 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
1af90 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
1afa0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
1afb0 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
1afc0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
1afd0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
1afe0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1aff0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
1b000 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
1b010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
1b020 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
1b030 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
1b040 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
1b050 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
1b060 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
1b070 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
1b080 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
1b090 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
1b0a0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
1b0b0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
1b0c0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
1b0d0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
1b0e0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
1b0f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1b100 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
1b110 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
1b120 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b130 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
1b140 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
1b150 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
1b160 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
1b170 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
1b180 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
1b190 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
1b1a0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1b1b0 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
1b1c0 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
1b1d0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1b1e0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
1b1f0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
1b200 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
1b210 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
1b220 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
1b230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b240 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1b250 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1b260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b270 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
1b280 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
1b290 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
1b2a0 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
1b2b0 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
1b2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b2d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1b2e0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1b2f0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1b300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b310 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
1b320 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1b330 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b340 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
1b350 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
1b360 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1b370 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
1b380 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b3a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1b3b0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
1b3c0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
1b3d0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
1b3e0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
1b3f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b400 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
1b410 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
1b420 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
1b430 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
1b440 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
1b450 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
1b460 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
1b470 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
1b480 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
1b490 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1b4a0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
1b4b0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
1b4c0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
1b4d0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
1b4e0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
1b4f0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
1b500 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
1b510 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
1b520 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1b530 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1b540 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1b550 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1b560 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1b570 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1b580 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1b590 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1b5a0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1b5b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b5c0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1b5d0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1b5e0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1b5f0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1b600 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1b610 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1b620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1b630 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1b640 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b650 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1b660 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b670 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1b680 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b690 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1b6a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b6b0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1b6c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b6d0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1b6e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1b6f0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1b700 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1b710 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1b720 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1b730 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1b740 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1b750 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1b760 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1b770 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1b780 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1b790 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1b7a0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1b7b0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1b7c0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1b7d0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1b7e0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1b7f0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1b800 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1b810 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1b820 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1b830 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1b840 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1b850 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1b860 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1b870 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1b880 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1b890 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1b8a0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1b8b0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1b8c0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1b8d0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1b8e0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1b8f0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1b900 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1b910 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1b920 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1b930 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1b940 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1b950 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1b960 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1b970 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1b980 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1b990 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1b9a0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1b9b0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1b9c0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1b9d0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1b9e0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1b9f0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1ba00 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1ba10 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1ba20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1ba30 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1ba40 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1ba50 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1ba60 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
1ba70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ba80 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1ba90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1baa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bab0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1bac0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1bad0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1bae0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1baf0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1bb00 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1bb10 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1bb20 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1bb30 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bb40 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1bb50 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1bb60 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1bb70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1bb80 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1bb90 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1bba0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1bbb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1bbc0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1bbd0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1bbe0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1bbf0 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1bc00 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1bc10 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1bc20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1bc30 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1bc40 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1bc50 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1bc60 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1bc70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1bc80 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1bc90 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1bca0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1bcb0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1bcc0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1bcd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bce0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bcf0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1bd00 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1bd10 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1bd20 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1bd30 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1bd40 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1bd50 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1bd60 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1bd70 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1bd80 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1bd90 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1bda0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1bdb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1bdc0 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1bdd0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1bde0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bdf0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1be00 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1be10 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1be20 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1be30 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1be40 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1be50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1be60 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1be70 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1be80 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1be90 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1bea0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1beb0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1bec0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1bed0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1bee0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1bef0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1bf00 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bf10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bf20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1bf30 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1bf40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1bf50 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1bf60 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1bf70 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1bf80 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1bf90 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1bfa0 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1bfb0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1bfc0 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1bfd0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1bfe0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1bff0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1c000 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1c010 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1c020 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1c030 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1c040 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1c050 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1c060 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1c070 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1c080 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1c090 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1c0a0 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1c0b0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1c0c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1c0d0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1c0e0 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1c0f0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1c100 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1c110 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1c120 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1c130 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1c140 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1c150 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1c160 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1c170 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1c180 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1c190 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1c1a0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1c1b0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1c1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1c1d0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1c1e0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1c1f0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1c200 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1c210 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1c220 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1c230 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1c240 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1c250 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1c260 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1c270 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1c280 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1c290 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1c2a0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1c2b0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1c2c0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1c2d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1c2e0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1c2f0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1c300 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1c310 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1c320 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1c330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c340 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1c350 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1c360 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c370 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1c380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1c390 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1c3a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c3b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c3c0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1c3d0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1c3e0 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1c3f0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1c400 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c420 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1c430 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1c440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c450 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1c460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c470 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1c480 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1c490 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1c4a0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1c4b0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1c4c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1c4d0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1c4e0 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1c4f0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1c500 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1c510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c520 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c530 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1c540 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1c550 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1c560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1c570 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1c580 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1c590 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1c5a0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1c5b0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1c5c0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1c5d0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1c5e0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1c5f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1c600 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1c610 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1c620 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1c630 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1c640 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1c650 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1c660 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1c670 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1c680 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1c690 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c6a0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1c6b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1c6c0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1c6d0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1c6e0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1c6f0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1c700 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1c710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c720 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1c730 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1c740 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1c750 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1c760 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1c770 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1c780 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1c790 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1c7a0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c7b0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1c7c0 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1c7d0 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1c7e0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1c7f0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1c800 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1c810 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1c820 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1c830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c840 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1c850 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1c860 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1c870 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1c880 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1c890 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1c8a0 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1c8b0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1c8c0 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1c8d0 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1c8e0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1c8f0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1c900 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1c910 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1c920 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c930 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1c940 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1c950 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1c960 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c970 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1c980 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1c990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c9b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c9c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1c9d0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1c9e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c9f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1ca00 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1ca10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca20 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1ca30 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1ca40 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1ca50 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1ca60 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1ca70 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1ca80 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1ca90 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1caa0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1cab0 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1cac0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1cad0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1cae0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1caf0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1cb00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1cb10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1cb20 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1cb30 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
1cb40 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
1cb50 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1cb60 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
1cb70 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cb80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1cb90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cba0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1cbb0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
1cbc0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
1cbd0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
1cbe0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
1cbf0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
1cc00 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
1cc10 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
1cc20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1cc30 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
1cc40 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
1cc50 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
1cc60 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
1cc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
1cc80 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
1cc90 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1cca0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
1ccd0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
1cce0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cd00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1cd10 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
1cd20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1cd50 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
1cd60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1cd70 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
1cd80 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1cd90 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1cda0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1cdb0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1cdc0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50  ex) );.  rc = pP
1cdd0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1cde0 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1cdf0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1ce00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ce20 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1ce30 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1ce40 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1ce50 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1ce60 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1ce70 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1ce80 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1ce90 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1cea0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1ceb0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1cec0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1ced0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1cee0 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1cef0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1cf00 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1cf10 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1cf20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1cf30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1cf40 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1cf50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1cf60 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1cf70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1cf80 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1cf90 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1cfa0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1cfb0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1cfc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cfd0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1cfe0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1cff0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1d000 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1d010 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1d020 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1d030 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1d040 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1d050 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1d060 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1d070 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1d080 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1d090 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1d0a0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1d0b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1d0c0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1d0d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d0e0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1d0f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1d100 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1d110 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1d120 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1d130 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1d140 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1d150 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1d160 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1d170 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1d180 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1d190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1d1a0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1d1b0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1d1c0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d1d0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1d1f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1d200 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1d210 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1d220 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1d230 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1d240 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1d250 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1d260 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d270 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1d280 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1d2a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1d2b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1d2c0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1d2d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d2e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1d2f0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1d300 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1d310 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1d320 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1d330 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1d340 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1d350 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d370 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1d380 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1d390 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d3a0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1d3b0 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1d3c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1d3d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1d3e0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1d3f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1d400 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1d410 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1d420 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d430 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1d440 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1d450 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1d460 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1d470 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1d480 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1d490 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1d4a0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1d4b0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1d4c0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1d4d0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1d4e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1d4f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1d500 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1d510 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1d520 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1d530 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1d540 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1d550 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1d560 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1d570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d580 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1d590 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d5a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1d5b0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1d5c0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1d5d0 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1d5e0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1d5f0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1d600 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1d610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d630 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d640 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1d650 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1d660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1d670 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1d680 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1d690 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1d6b0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1d6c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1d6d0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1d6e0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1d6f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1d700 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1d710 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1d720 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d730 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d740 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1d750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1d760 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d770 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d780 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1d790 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d7a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d7b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d7c0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1d7d0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1d7e0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1d7f0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1d800 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1d810 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1d820 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1d830 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1d840 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1d850 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1d860 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1d870 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1d880 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1d890 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1d8a0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1d8b0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1d8c0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1d8d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1d8e0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1d8f0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1d900 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1d910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1d920 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1d930 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1d940 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1d950 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1d960 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1d970 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1d980 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1d990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d9a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1d9b0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1d9c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1d9d0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1d9e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1d9f0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1da00 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1da10 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1da20 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1da30 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1da40 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1da50 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1da60 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1da70 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1da80 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1da90 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1daa0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1dab0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1dac0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1dad0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1dae0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1daf0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1db00 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1db10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1db20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1db30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1db40 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1db50 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1db60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1db70 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1db80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1db90 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1dba0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1dbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1dbc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dbd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dbe0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1dbf0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1dc00 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1dc10 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1dc20 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1dc30 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1dc40 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1dc50 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1dc60 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1dc70 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1dc80 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1dc90 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1dca0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1dcb0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1dcc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dcd0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1dce0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1dcf0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1dd00 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1dd10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dd20 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1dd30 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1dd40 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1dd50 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1dd60 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1dd70 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1dd80 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1dd90 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1dda0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1ddb0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1ddc0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1ddd0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1dde0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1ddf0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1de00 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1de10 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1de20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1de30 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1de40 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1de50 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1de60 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1de70 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1de80 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1de90 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1dea0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1deb0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1dec0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1ded0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1dee0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1def0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1df00 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1df10 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1df20 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1df30 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1df40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1df50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1df60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1df70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1df80 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1df90 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1dfa0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1dfb0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1dfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1dfd0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1dfe0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1dff0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1e000 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1e010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e020 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1e030 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e040 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1e050 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1e060 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1e070 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1e080 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1e090 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1e0a0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1e0b0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1e0c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e0d0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1e0e0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1e0f0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1e100 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1e110 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1e120 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1e130 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1e140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e160 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e180 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1e190 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1e1a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e1b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1e1c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1e1d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1e1e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e1f0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1e200 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1e210 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1e220 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1e230 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1e240 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1e250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e260 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1e270 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1e280 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1e290 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1e2a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e2b0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1e2c0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1e2d0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1e2e0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1e2f0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1e300 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1e310 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1e320 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1e330 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1e340 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1e350 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1e360 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1e370 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1e380 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1e390 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1e3a0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1e3b0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1e3c0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1e3d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1e3e0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1e3f0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1e400 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1e410 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1e420 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1e430 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1e440 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1e450 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1e460 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1e470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1e480 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1e490 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1e4a0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1e4b0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1e4c0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1e4d0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1e4e0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e4f0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1e500 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1e510 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1e520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1e530 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1e540 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1e550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1e560 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1e570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1e580 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1e590 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1e5a0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1e5b0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1e5c0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1e5d0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1e5e0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1e5f0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1e600 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1e610 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1e620 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1e630 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1e640 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1e650 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1e660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1e670 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1e680 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1e690 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1e6a0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1e6b0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1e6c0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1e6d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e6e0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1e6f0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1e700 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1e710 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e720 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1e740 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1e750 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1e760 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1e770 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1e780 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e790 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1e7a0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1e7b0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1e7c0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1e7d0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e7e0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e7f0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1e800 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e810 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1e820 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1e830 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1e840 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1e850 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1e860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e880 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1e890 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e8a0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1e8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e8d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1e8e0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1e8f0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1e900 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1e910 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1e920 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1e930 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1e940 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1e950 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1e960 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1e970 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1e980 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1e990 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1e9a0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1e9b0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1e9c0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1e9d0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1e9e0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1e9f0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1ea00 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1ea10 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1ea20 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1ea30 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1ea40 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1ea50 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1ea60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1ea70 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1ea80 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1ea90 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1eaa0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1eab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1eac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ead0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1eae0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1eaf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1eb00 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1eb10 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1eb20 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1eb30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1eb40 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1eb50 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1eb60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1eb70 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1eb80 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1eb90 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1eba0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1ebb0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1ebc0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1ebd0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1ebe0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1ebf0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1ec00 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1ec10 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1ec20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1ec30 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1ec40 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1ec50 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ec60 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1ec70 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1ec80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ec90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1eca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ecb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1ecc0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1ecd0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1ece0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1ecf0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1ed00 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1ed10 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1ed20 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1ed30 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1ed40 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1ed50 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1ed60 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1ed70 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1ed80 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1ed90 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1eda0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1edb0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1edc0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1edd0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1ede0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1edf0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1ee00 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1ee10 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1ee20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1ee30 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1ee40 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1ee50 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1ee60 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1ee70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1ee80 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1ee90 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1eea0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1eeb0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1eec0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1eed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eee0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1eef0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1ef00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ef10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ef20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ef30 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1ef40 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1ef50 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1ef60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ef70 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1ef80 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1ef90 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1efa0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1efb0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1efc0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1efd0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1efe0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1eff0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f020 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1f030 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1f040 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1f050 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1f060 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1f070 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1f080 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1f090 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1f0a0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1f0b0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f0c0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1f0d0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1f0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f0f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f100 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1f110 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1f120 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1f130 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1f140 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1f150 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1f160 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1f170 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1f180 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1f190 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1f1a0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1f1b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1f1c0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1f1d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1f1e0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1f1f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1f200 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1f210 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1f220 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f240 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1f250 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1f260 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1f270 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1f280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f290 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1f2a0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1f2b0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1f2e0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1f2f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1f300 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1f310 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1f320 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1f330 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1f340 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1f350 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1f360 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1f370 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1f380 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1f390 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1f3a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1f3b0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1f3c0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1f3d0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1f3e0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1f3f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f400 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1f410 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1f420 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1f430 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f440 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1f450 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1f460 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1f470 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1f480 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1f490 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1f4a0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1f4b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1f4c0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1f4d0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1f4e0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1f4f0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1f500 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1f510 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1f520 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1f530 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1f540 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1f550 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1f560 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1f570 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1f580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f590 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1f5a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1f5b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f5c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1f5d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f5e0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1f5f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f600 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1f610 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1f620 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1f630 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1f640 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1f650 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1f660 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1f670 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1f680 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1f690 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1f6a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f6b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1f6c0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1f6d0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1f6e0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1f6f0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1f700 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1f710 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1f720 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1f730 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1f740 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1f750 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1f760 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1f770 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f780 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1f790 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1f7a0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1f7b0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1f7c0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1f7d0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1f7e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1f7f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f810 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1f820 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1f830 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1f840 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1f850 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1f860 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1f870 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1f880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f890 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1f8a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1f8b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1f8c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1f8d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1f8e0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1f8f0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f900 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1f910 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1f920 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1f930 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1f950 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f960 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1f970 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1f980 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1f990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f9a0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1f9b0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1f9c0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1f9d0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1f9e0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1f9f0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1fa00 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1fa10 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1fa20 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1fa30 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1fa40 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1fa50 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1fa60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1fa70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1fa80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1fa90 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1faa0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1fab0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1fac0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1fad0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fae0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1faf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1fb00 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1fb10 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1fb20 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1fb30 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1fb40 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1fb50 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1fb60 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1fb70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fb80 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1fb90 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1fba0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1fbb0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1fbc0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1fbd0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1fbe0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1fbf0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1fc00 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1fc10 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1fc20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1fc30 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1fc40 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1fc50 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1fc60 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1fc70 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1fc80 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1fc90 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1fca0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1fcb0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1fcc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1fcd0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1fce0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1fcf0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1fd00 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1fd10 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1fd20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1fd30 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1fd40 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1fd50 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1fd60 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1fd70 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1fd80 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1fd90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fda0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fdb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1fdc0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fdd0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fde0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1fdf0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1fe00 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1fe10 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1fe20 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1fe30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fe40 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1fe50 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1fe60 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1fe70 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1fe80 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1fe90 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1fea0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1feb0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1fec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1fed0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1fee0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1fef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ff00 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ff10 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1ff20 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1ff30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ff40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1ff50 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1ff60 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1ff70 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ff80 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1ff90 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ffa0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ffb0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1ffc0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ffd0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ffe0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1fff0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20000 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
20010 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
20020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20040 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20050 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
20060 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
20070 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
20080 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20090 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
200a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
200b0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
200c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
200d0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
200e0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
200f0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
20100 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
20110 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
20120 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
20130 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
20140 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
20150 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
20160 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20170 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
20180 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
20190 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
201a0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
201b0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
201c0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
201d0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
201e0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
201f0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
20200 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
20210 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
20220 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
20230 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
20240 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
20250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
20260 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
20270 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
20280 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
20290 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
202a0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
202b0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
202c0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
202d0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
202e0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
202f0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
20300 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
20310 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
20320 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
20330 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
20340 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
20350 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
20360 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
20370 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20380 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
20390 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
203a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
203b0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
203c0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
203d0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
203e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
203f0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
20400 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
20410 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
20420 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
20430 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
20440 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
20450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
20460 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
20470 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
20480 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
20490 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
204a0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
204b0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
204c0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
204d0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
204e0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
204f0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
20500 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20510 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
20520 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
20530 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
20540 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
20550 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
20560 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
20570 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
20580 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
20590 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
205a0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
205b0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
205c0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
205d0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
205e0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
205f0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
20600 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
20610 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
20620 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
20630 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
20640 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
20650 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
20660 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20670 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
20680 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
20690 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
206a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
206b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
206c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
206d0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
206e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
206f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20700 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
20710 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20720 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
20730 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
20740 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
20750 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
20760 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20780 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20790 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
207a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
207b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
207c0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
207d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
207e0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
207f0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
20800 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
20810 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20830 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
20840 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
20850 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
20860 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20870 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
20880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
208a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
208b0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
208c0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
208d0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
208e0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
208f0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
20900 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
20910 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
20920 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
20930 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20940 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
20950 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
20960 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20970 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
20980 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
20990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
209a0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
209b0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
209c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
209d0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
209e0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
209f0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
20a00 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
20a10 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
20a20 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
20a30 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
20a40 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
20a50 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
20a60 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
20a70 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
20a80 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
20a90 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
20aa0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
20ab0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
20ac0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
20ad0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20ae0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
20af0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
20b00 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
20b10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
20b20 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
20b30 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
20b40 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
20b50 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
20b60 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
20b70 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
20b80 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
20b90 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
20ba0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
20bb0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
20bc0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
20bd0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
20be0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
20bf0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
20c00 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
20c10 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
20c20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
20c30 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
20c40 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
20c50 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
20c60 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
20c70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
20c80 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
20c90 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
20ca0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
20cb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
20cc0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
20cd0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20ce0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
20cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
20d00 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
20d10 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
20d20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
20d30 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
20d40 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
20d50 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
20d60 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
20d70 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
20d80 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
20d90 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
20da0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
20db0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
20dc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
20dd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20de0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
20df0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
20e00 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
20e10 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
20e20 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
20e30 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
20e40 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
20e50 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
20e60 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
20e70 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
20e80 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
20e90 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
20ea0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
20eb0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
20ec0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20ed0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
20ee0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
20ef0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
20f00 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
20f10 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
20f20 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
20f30 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
20f40 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
20f50 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
20f60 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
20f70 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
20f80 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
20f90 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
20fa0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
20fb0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20fc0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
20fd0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
20fe0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
20ff0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
21000 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
21010 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
21020 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
21030 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
21040 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
21050 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
21060 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
21070 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
21080 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21090 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
210a0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
210b0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
210c0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
210d0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
210e0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
210f0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
21100 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
21110 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
21120 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
21130 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
21140 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
21150 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
21160 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
21170 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
21180 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
21190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
211a0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
211b0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
211c0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
211d0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
211e0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
211f0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
21200 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
21210 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
21220 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
21230 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
21240 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
21250 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
21260 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
21270 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
21280 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
21290 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
212a0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
212b0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
212c0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
212d0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
212e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
212f0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
21300 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
21310 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
21320 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
21330 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
21340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21350 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
21360 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
21370 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
21380 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21390 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
213a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
213b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
213c0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
213d0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
213e0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
213f0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
21400 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
21410 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
21420 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
21430 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
21440 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
21450 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
21460 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
21470 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
21480 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
21490 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
214a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
214b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
214c0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
214d0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
214e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
214f0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
21500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21510 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
21520 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
21530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21540 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
21550 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
21560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21570 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
21580 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
21590 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
215a0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
215b0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
215c0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
215d0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
215e0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
215f0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
21600 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
21610 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
21620 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
21630 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
21640 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
21650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21660 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
21670 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
21680 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
21690 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
216a0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
216b0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
216c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
216d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
216e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
216f0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
21700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21710 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21720 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
21730 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
21740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21750 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
21770 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
21780 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
21790 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
217a0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
217b0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
217c0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
217d0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
217e0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
217f0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
21800 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
21810 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
21820 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
21830 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
21840 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
21850 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
21860 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
21870 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
21880 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
21890 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
218a0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
218b0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
218c0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
218d0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
218e0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
218f0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
21900 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21910 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
21920 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
21930 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
21940 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
21950 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
21960 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
21970 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
21980 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
21990 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
219a0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
219b0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
219c0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
219d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
219e0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
219f0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
21a00 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
21a10 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
21a20 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
21a30 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
21a40 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
21a50 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
21a60 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
21a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
21a80 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
21a90 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
21aa0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
21ab0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
21ac0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21ad0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
21ae0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
21af0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
21b00 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
21b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
21b20 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
21b30 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
21b40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21b50 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
21b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
21b70 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
21b80 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
21b90 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
21ba0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
21bb0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
21bc0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
21bd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21be0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
21bf0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
21c00 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
21c10 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
21c20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
21c30 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
21c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21c50 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
21c60 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
21c70 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
21c80 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
21c90 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
21ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21cb0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
21cc0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
21cd0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
21ce0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
21cf0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
21d00 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
21d10 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
21d20 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
21d30 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
21d40 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
21d50 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72  t){.      if( wr
21d60 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
21d70 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
21d80 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
21d90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
21da0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21db0 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
21dc0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
21dd0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
21de0 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
21df0 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
21e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
21e30 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
21e40 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
21e50 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
21e60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21e80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21e90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
21ea0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
21eb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
21ec0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
21ed0 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
21ee0 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
21ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21f00 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
21f10 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
21f20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21f30 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
21f40 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
21f50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
21f60 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
21f70 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
21f80 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
21f90 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
21fa0 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
21fb0 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
21fc0 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
21fd0 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
21fe0 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
21ff0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22000 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
22010 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
22020 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
22030 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
22040 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
22050 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
22060 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
22070 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
22080 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
22090 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
220a0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
220b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
220c0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
220d0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
220e0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
220f0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
22100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22110 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
22120 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
22130 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22140 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
22150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22160 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
22170 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
22180 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
22190 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
221a0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
221b0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
221c0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
221d0 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
221e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
221f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22200 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
22210 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
22220 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
22230 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
22240 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
22250 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
22260 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
22270 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
22280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22290 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
222a0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
222b0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
222c0 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
222d0 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
222e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
222f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
22300 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
22310 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
22320 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22330 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
22340 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
22350 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
22360 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
22370 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
22380 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
22390 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
223a0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
223b0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
223c0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
223d0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
223e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
223f0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
22410 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
22420 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
22430 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
22440 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
22450 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
22460 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
22470 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
22480 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
22490 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
224a0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
224b0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
224c0 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
224d0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
224e0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
224f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
22500 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
22510 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
22520 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
22530 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
22540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22550 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
22560 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
22570 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
22580 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
22590 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
225a0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
225b0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
225c0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
225d0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
225e0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
225f0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
22600 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
22610 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
22620 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
22630 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
22640 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
22650 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
22660 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
22670 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
22680 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
226a0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
226b0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
226c0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
226d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
226e0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
226f0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
22700 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
22710 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
22720 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
22730 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
22740 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
22750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
22760 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
22770 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
22780 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
22790 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
227a0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
227b0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
227c0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
227d0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
227e0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
227f0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
22800 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
22810 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
22820 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
22830 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
22840 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
22850 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
22860 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22870 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
22880 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
22890 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
228a0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
228b0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
228c0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
228d0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
228e0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
228f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
22900 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
22910 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
22920 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
22930 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
22940 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
22950 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
22960 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
22970 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
22980 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
22990 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
229a0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
229b0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
229c0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
229d0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
229e0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
229f0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
22a00 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
22a10 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
22a20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
22a30 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
22a40 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
22a50 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
22a60 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
22a70 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
22a80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22a90 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
22aa0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
22ab0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
22ac0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
22ad0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
22ae0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22af0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
22b00 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
22b10 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
22b20 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
22b30 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
22b40 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
22b50 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
22b60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
22b70 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
22b80 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
22b90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
22ba0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
22bb0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
22bc0 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
22bd0 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
22be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22bf0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
22c00 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
22c10 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
22c20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
22c30 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
22c40 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
22c50 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
22c60 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
22c70 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
22c80 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
22c90 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
22ca0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
22cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
22cc0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
22cd0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
22ce0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
22cf0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
22d00 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
22d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22d20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22d30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22d40 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
22d50 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
22d60 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
22d70 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
22d80 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
22d90 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
22da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
22db0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
22dc0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
22dd0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
22de0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
22df0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
22e00 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
22e10 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
22e20 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
22e30 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
22e40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
22e50 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
22e60 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
22e70 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
22e80 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
22e90 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
22ea0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
22eb0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
22ec0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
22ed0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22ee0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
22ef0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
22f00 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
22f10 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
22f20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
22f30 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
22f40 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
22f50 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
22f60 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
22f70 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
22f80 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
22f90 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
22fa0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
22fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22fc0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
22fd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
22fe0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
22ff0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
23000 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
23010 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
23020 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
23030 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
23040 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
23050 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
23060 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
23070 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
23080 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
23090 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
230a0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  (p);.    if( op=
230b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
230c0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
230d0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
230e0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
230f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23120 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
23130 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
23140 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
23150 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23170 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
23180 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
23190 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
231a0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
231b0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
231c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
231d0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
231e0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
231f0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
23200 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
23210 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
23220 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
23230 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
23240 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
23250 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
23260 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
23270 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
23280 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
23290 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
232a0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
232b0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
232c0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
232d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
232e0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
232f0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23300 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
23310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
23330 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
23340 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
23350 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
23360 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
23370 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
23380 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
23390 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
233a0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
233b0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
233c0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
233d0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
233e0 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
233f0 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
23400 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
23410 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
23420 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
23430 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
23440 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
23450 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
23460 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
23470 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
23480 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63  t of wrFlag is c
23490 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
234a0 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a  ursor can only.*
234b0 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  * be used for re
234c0 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42  ading.  If the B
234d0 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 69  TREE_WRCSR bit i
234e0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
234f0 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65  cursor.** can be
23500 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
23510 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  g or for writing
23520 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
23530 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
23540 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  .** are also met
23550 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68 65  .  These are the
23560 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
23570 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
23580 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69  order.** for wri
23590 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77  ting to be allow
235a0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
235b0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
235c0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
235d0 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61  ith wrFlag conta
235e0 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53  ining BTREE_WRCS
235f0 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  R.**.** 2:  Othe
23600 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
23610 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
23620 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
23630 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
23640 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
23650 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
23660 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
23670 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
23680 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
23690 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
236a0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
236b0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
236c0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
236d0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
236e0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
236f0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
23700 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
23710 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
23720 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
23730 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
23740 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
23750 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
23760 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
23770 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
23780 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
23790 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
237a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
237b0 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45   BTREE_FORDELETE
237c0 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d   bit of wrFlag m
237d0 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65  ay optionally be
237e0 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57 52   set if BTREE_WR
237f0 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20  CSR.** is set.  
23800 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20  If FORDELETE is 
23810 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20 68  set, that is a h
23820 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
23830 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a  mentation that.*
23840 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69  * this cursor wi
23850 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ll only be used 
23860 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64  to seek to and d
23870 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66  elete entries of
23880 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20   an index.** as 
23890 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
238a0 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
238b0 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54  t.  The FORDELET
238c0 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73  E hint is not us
238d0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d  ed by.** this im
238e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42  plementation.  B
238f0 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74  ut in a hypothet
23900 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65  ical alternative
23910 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20   storage engine 
23920 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64  .** in which ind
23930 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ex entries are a
23940 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
23950 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73  eted when corres
23960 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a  ponding table.**
23970 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65   rows are delete
23980 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45  d, the FORDELETE
23990 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20   flag is a hint 
239a0 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e  that all SEEK an
239b0 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72  d DELETE.** oper
239c0 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63  ations on this c
239d0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d  ursor can be no-
239e0 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44  ops and all READ
239f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20   operations can 
23a00 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c  .** return a nul
23a10 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20  l row (2-bytes: 
23a20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a  0x01 0x00)..**.*
23a30 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
23a40 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
23a50 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
23a60 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
23a70 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
23a80 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
23a90 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
23aa0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
23ab0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
23ac0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
23ad0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
23ae0 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
23af0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
23b00 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
23b10 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
23b20 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
23b30 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
23b40 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
23b50 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
23b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
23b70 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
23b80 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
23bb0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
23bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23be0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
23bf0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
23c00 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
23c30 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
23c40 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
23c50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23c70 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
23c80 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
23c90 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
23ca0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cc0 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
23cd0 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
23ce0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23cf0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
23d00 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
23d10 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
23d20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20    BtCursor *pX; 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
23d50 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61  ing over other a
23d60 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  ll cursors */.. 
23d70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23d80 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
23d90 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
23da0 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20  wrFlag==0 .     
23db0 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52    || wrFlag==BTR
23dc0 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20  EE_WRCSR .      
23dd0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52   || wrFlag==(BTR
23de0 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46  EE_WRCSR|BTREE_F
23df0 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a  ORDELETE) .  );.
23e00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
23e10 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
23e20 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
23e30 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
23e40 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
23e50 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
23e60 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
23e70 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
23e80 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
23e90 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
23ea0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
23eb0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
23ec0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
23ed0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
23ee0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
23ef0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
23f00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
23f10 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
23f20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72  pKeyInfo!=0, (wr
23f30 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20  Flag?2:1)) );.  
23f40 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
23f50 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
23f60 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
23f70 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
23f80 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
23f90 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
23fa0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
23fb0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
23fc0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
23fd0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
23fe0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
23ff0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
24000 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
24010 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
24020 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
24030 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
24040 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24050 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 || (pBt->btsFl
24060 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
24070 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  NLY)==0 );..  if
24080 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
24090 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
240a0 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  e(pBt);.    if( 
240b0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d  pBt->pTmpSpace==
240c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
240d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
240e0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
240f0 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
24100 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
24110 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
24120 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
24130 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
24140 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
24150 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
24160 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
24170 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
24180 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
24190 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
241a0 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
241b0 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
241c0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
241d0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
241e0 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
241f0 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
24200 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
24210 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
24220 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
24230 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
24240 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
24250 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
24260 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
24270 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
24280 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
24290 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
242a0 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
242b0 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
242c0 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
242d0 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
242e0 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
242f0 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
24300 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
24310 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
24320 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
24330 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
24340 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
24350 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
24360 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
24370 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
24380 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
24390 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
243a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
243b0 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
243c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
243d0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
243e0 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
243f0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
24400 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24410 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24420 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24430 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
24440 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
24450 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24480 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
24490 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
244c0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
244d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
244e0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
24510 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
24520 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
24530 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24540 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
24550 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24560 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
24570 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
24580 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
245b0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
245c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
245d0 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
245e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
245f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
24600 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
24610 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
24620 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
24630 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
24640 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
24650 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
24660 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
24670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24690 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
246a0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
246b0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
246c0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
246d0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
246e0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
246f0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
24700 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
24710 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
24720 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
24730 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
24740 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
24750 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
24760 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
24770 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
24780 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
24790 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
247a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
247b0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
247c0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
247d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
247e0 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
247f0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
24800 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
24810 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
24820 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
24830 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
24840 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
24850 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
24860 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
24870 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
24880 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
24890 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
248a0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
248b0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
248c0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
248d0 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
248e0 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
248f0 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
24900 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
24910 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
24920 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
24930 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
24940 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
24950 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
24960 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
24970 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
24980 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
24990 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54  , BTCURSOR_FIRST
249a0 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a  _UNINIT));.}../*
249b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
249c0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
249d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
249e0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
249f0 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
24a00 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
24a10 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
24a20 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
24a30 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
24a40 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
24a50 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
24a60 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
24a70 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ree ){.    BtSha
24a80 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
24a90 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
24aa0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
24ab0 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ee);.    assert(
24ac0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30   pBt->pCursor!=0
24ad0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   );.    if( pBt-
24ae0 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29  >pCursor==pCur )
24af0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
24b00 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
24b10 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
24b20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70       BtCursor *p
24b30 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72  Prev = pBt->pCur
24b40 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  sor;.      do{. 
24b50 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76         if( pPrev
24b60 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b  ->pNext==pCur ){
24b70 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76  .          pPrev
24b80 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
24b90 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
24ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24bb0 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20  }.        pPrev 
24bc0 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a  = pPrev->pNext;.
24bd0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c        }while( AL
24be0 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20  WAYS(pPrev) );. 
24bf0 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65     }.    btreeRe
24c00 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
24c10 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75  ges(pCur);.    u
24c20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
24c30 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
24c40 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
24c50 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
24c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
24c70 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71  r->pKey);.    sq
24c80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
24c90 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
24ca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
24cc0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
24cd0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
24ce0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
24cf0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
24d00 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
24d10 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
24d20 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
24d30 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
24d40 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
24d50 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
24d60 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
24d70 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
24d80 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
24d90 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
24da0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
24db0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
24dc0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
24dd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
24de0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
24df0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
24e00 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
24e10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24e20 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
24e30 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
24e40 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
24e50 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
24e60 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
24e70 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  >pPage, pCur->ix
24e80 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
24e90 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
24ea0 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f   || memcmp(&info
24eb0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
24ec0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
24ed0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
24ee0 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
24ef0 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
24f00 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
24f10 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43  INLINE void getC
24f20 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
24f30 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70   *pCur){.  if( p
24f40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
24f50 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
24f60 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
24f70 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
24f80 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
24f90 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d  Cur->pPage,pCur-
24fa0 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  >ix,&pCur->info)
24fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24fc0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
24fd0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
24fe0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
24ff0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
25000 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
25010 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
25020 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
25030 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
25040 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
25050 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
25060 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
25070 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
25080 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
25090 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
250a0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
250b0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
250c0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
250d0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
250e0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
250f0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
25100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
25110 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
25120 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
25130 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
25140 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25150 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
25160 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
25170 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25180 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
25190 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
251a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
251b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
251c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
251d0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
251e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
251f0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
25200 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69  ger key or "rowi
25210 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  d" for a table b
25220 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tree..** This ro
25230 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61  utine is only va
25240 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  lid for a cursor
25250 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
25260 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69  g into a.** ordi
25270 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65  nary table btree
25280 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25290 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e   points to an in
252a0 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20  dex btree or.** 
252b0 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20  is invalid, the 
252c0 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72  result of this r
252d0 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69  outine is undefi
252e0 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ned..*/.i64 sqli
252f0 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
25300 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
25310 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
25320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25330 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25340 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25350 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
25360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25370 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67  curIntKey );.  g
25380 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
25390 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
253a0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23  >info.nKey;.}..#
253b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
253c0 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
253d0 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UNC./*.** Return
253e0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
253f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25400 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  le for the start
25410 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f   of the.** paylo
25420 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ad to which the 
25430 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25440 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ng..*/.i64 sqlit
25450 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74  e3BtreeOffset(Bt
25460 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25470 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25480 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
254a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
254b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
254c0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
254d0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43    return (i64)pC
254e0 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
254f0 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50  e*((i64)pCur->pP
25500 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b  age->pgno - 1) +
25510 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28  .         (i64)(
25520 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
25530 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67  oad - pCur->pPag
25540 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e  e->aData);.}.#en
25550 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
25560 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
25570 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  FUNC */../*.** R
25580 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
25590 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
255a0 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
255b0 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
255c0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
255d0 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
255e0 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
255f0 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
25600 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
25610 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
25620 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
25630 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
25640 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
25650 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
25660 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
25670 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25680 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
25690 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
256a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
256b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
256c0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
256d0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
256e0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
256f0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
25700 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
25710 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
25720 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
25730 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25740 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25750 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25760 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25770 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25780 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25790 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
257a0 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
257b0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
257c0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
257d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
257e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
257f0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
25800 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
25810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
25820 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
25830 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
25840 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
25850 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
25860 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
25870 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
25880 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
25890 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
258a0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
258b0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
258c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
258d0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
258e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
258f0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
25900 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
25910 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
25920 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
25930 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25940 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
25950 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
25960 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
25970 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
25980 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
25990 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
259a0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
259b0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
259c0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
259d0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
259e0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
259f0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
25a00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
25a10 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
25a20 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
25a30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
25a40 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
25a50 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
25a60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
25a70 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
25a80 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
25a90 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
25aa0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
25ab0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
25ac0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
25ad0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
25ae0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
25af0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
25b00 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
25b10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
25b20 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
25b30 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
25b40 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
25b50 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
25b60 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
25b70 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
25b80 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
25b90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
25ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25bc0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
25bf0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
25c00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
25c10 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
25c20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
25c30 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
25c40 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
25c50 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
25c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25c70 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
25c80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
25c90 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
25ca0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
25cb0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
25cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25cd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25ce0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25d00 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
25d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25d20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25d30 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
25d40 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
25d50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
25d60 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
25d70 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
25d80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
25d90 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
25da0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
25db0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
25dc0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
25dd0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
25de0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
25df0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
25e00 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
25e10 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
25e20 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
25e30 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
25e40 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
25e50 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
25e60 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
25e70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25e80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
25e90 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
25ea0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
25eb0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
25ec0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
25ed0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
25ee0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
25ef0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25f00 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
25f10 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
25f20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
25f30 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
25f40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
25f50 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
25f60 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
25f70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
25f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25f90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
25fa0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
25fb0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
25fc0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
25fd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25fe0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
25ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
26000 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
26010 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
26020 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
26030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
26050 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
26060 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
26070 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
26080 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26090 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
260a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
260b0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
260c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
260d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
260e0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
260f0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
26100 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
26110 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
26120 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
26130 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
26140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
26150 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
26160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
26170 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
26180 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
26190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
261a0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
261b0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
261c0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
261d0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
261e0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
261f0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
26200 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
26210 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
26220 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
26230 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
26240 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
26250 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
26260 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
26270 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
26280 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
26290 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
262a0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
262b0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
262c0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
262d0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
262e0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
262f0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
26300 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
26310 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
26320 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
26330 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
26340 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
26350 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
26360 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
26370 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
26380 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
26390 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
263a0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
263b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
263c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
263d0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
263e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26400 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
26410 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
26420 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
26430 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
26440 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
26450 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
26460 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
26470 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
26480 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
26490 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
264a0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
264b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
264c0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
264d0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
264e0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
264f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
26500 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
26510 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26540 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
26550 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
26560 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
26570 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
26580 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
26590 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
265a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
265b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
265c0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
265d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
265e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
265f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26600 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
26610 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
26620 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
26630 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
26640 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
26650 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
26660 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
26670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
26680 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
26690 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
266a0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
266b0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
266c0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
266d0 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
266e0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
266f0 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
26700 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
26710 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
26720 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
26730 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
26740 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
26750 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
26760 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
26770 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
26780 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
26790 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
267a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
267b0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
267c0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
267d0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
267e0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
267f0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
26800 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26810 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
26820 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
26830 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26840 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
26850 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
26860 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
26870 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
26880 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
26890 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
268a0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
268b0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
268c0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
268d0 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
268e0 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
268f0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
26900 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
26910 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
26920 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
26930 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26940 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
26950 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
26960 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
26970 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
26980 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
26990 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
269a0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
269b0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
269c0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
269d0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
269e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
269f0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
26a00 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
26a10 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
26a20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26a30 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
26a40 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
26a50 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
26a60 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
26a70 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
26a80 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
26a90 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
26aa0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
26ab0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
26ac0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
26ad0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
26ae0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26af0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
26b00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
26b10 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
26b20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
26b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
26b40 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
26b50 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
26b60 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
26b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26b80 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
26b90 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
26ba0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
26bb0 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
26bc0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
26bd0 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
26bf0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
26c00 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
26c10 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
26c20 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
26c30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26c40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
26c50 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
26c60 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
26c70 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
26c80 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
26c90 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
26ca0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
26cb0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
26cc0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26cd0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
26ce0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
26cf0 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
26d00 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26d10 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
26d20 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
26d30 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
26d40 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
26d50 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
26d60 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
26d70 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
26d80 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26d90 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
26da0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
26db0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26dc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26dd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
26de0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26df0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26e00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26e10 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
26e20 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
26e30 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
26e40 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
26e50 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
26e60 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
26e70 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
26e80 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
26e90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
26ea0 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
26eb0 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
26ec0 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
26ed0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
26ee0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
26ef0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
26f00 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
26f10 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
26f20 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
26f30 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
26f40 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
26f50 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
26f60 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
26f70 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
26f80 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
26f90 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
26fa0 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
26fb0 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
26fc0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
26fd0 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
26fe0 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
26ff0 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
27000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27010 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
27020 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  e);.  }..  /* Ch
27030 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
27040 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
27050 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
27060 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
27070 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
27080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27090 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
270a0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
270b0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
270c0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
270d0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
270e0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
270f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27100 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
27110 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
27120 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
27130 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
27140 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
27150 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
27160 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
27170 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
27180 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
27190 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
271a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
271b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
271c0 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
271d0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
271e0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
271f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
27200 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
27210 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
27220 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
27230 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
27240 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
27250 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
27260 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
27270 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
27280 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
27290 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
272a0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  now..    **.    
272b0 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
272c0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
272d0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
272e0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
272f0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
27300 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
27310 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
27320 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
27330 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27340 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
27350 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
27360 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
27370 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
27380 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
27390 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
273a0 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
273b0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
273c0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
273d0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
273e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
273f0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b  ValidOvfl)==0 ){
27400 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
27410 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
27420 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
27430 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
27440 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
27450 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27460 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20  aOverflow==0.   
27470 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 73 69 7a      || nOvfl*siz
27480 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27490 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
274a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
274b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
274c0 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
274d0 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
274e0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
274f0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
27500 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
27510 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
27520 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
27530 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27550 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27570 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27580 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
275a0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
275b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
275c0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
275d0 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
275e0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
275f0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
27600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27610 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
27620 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27630 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27640 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
27650 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
27660 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
27670 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27680 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27690 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
276a0 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
276b0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
276c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
276d0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
276e0 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
276f0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
27700 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27710 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27720 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27730 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27740 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27760 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27770 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27780 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27790 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
277a0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
277b0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
277c0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
277d0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
277e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
277f0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27800 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27810 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
27820 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
27830 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
27840 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
27850 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
27860 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
27870 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
27880 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
27890 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
278a0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
278b0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
278c0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
278d0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
278e0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
278f0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
27900 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
27910 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
27920 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
27930 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
27940 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
27950 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
27960 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
27970 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
27980 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
27990 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
279a0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
279b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
279c0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
279d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
279e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
279f0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
27a00 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
27a10 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
27a20 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
27a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
27a40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27a50 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
27a60 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
27a70 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27a80 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
27a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
27aa0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27ab0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
27ac0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
27ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27ae0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
27af0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
27b00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27b10 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
27b20 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
27b30 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
27b40 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
27b50 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
27b60 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
27b70 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
27b80 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
27b90 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
27ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27bb0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27bc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27bd0 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
27be0 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
27bf0 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
27c00 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
27c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27c20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
27c30 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
27c40 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
27c50 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
27c60 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
27c70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
27c80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27c90 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27ca0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
27cb0 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
27cc0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
27cd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27ce0 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
27cf0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
27d00 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
27d10 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
27d20 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
27d30 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
27d40 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
27d50 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
27d60 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
27d70 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27d80 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
27d90 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
27da0 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
27db0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
27dc0 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
27dd0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
27de0 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
27df0 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
27e00 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
27e10 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
27e20 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
27e30 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
27e40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
27e50 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
27e60 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
27e70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
27e80 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
27e90 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
27ea0 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
27eb0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
27ec0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
27ed0 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
27ee0 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
27ef0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
27f00 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
27f10 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
27f20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
27f30 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
27f70 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
27f80 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27fb0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
27fc0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
27fd0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
27fe0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
27ff0 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
28000 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
28010 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
28020 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
28030 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
28040 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
28050 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
28060 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
28070 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
28080 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
28090 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
280a0 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
280b0 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
280e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
280f0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
28100 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
28110 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
28120 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
28130 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
28140 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
28170 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28180 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
28190 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
281a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
281b0 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
281c0 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
281d0 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
281e0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
281f0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28200 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
28210 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
28220 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
28230 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
28240 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
28250 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
28260 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
28270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28280 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
28290 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
282a0 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
282b0 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
282c0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
282d0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
282e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
282f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28310 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
28320 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
28330 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
28340 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
28350 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
28360 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
28370 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28380 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28390 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
283a0 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
283c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
283d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
283e0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
283f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
28410 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
28420 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
28430 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28440 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
28450 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
28460 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28470 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
28480 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28490 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
284a0 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
284b0 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
284c0 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
284d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
284e0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
284f0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
28500 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28510 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  ad part of the p
28520 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72  ayload for the r
28530 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74  ow at which that
28540 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28550 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
28560 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79  nting.  "amt" by
28570 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
28580 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
28590 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
285a0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
285b0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
285c0 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e  pCur can be poin
285d0 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61  ting to either a
285e0 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64   table or an ind
285f0 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66  ex b-tree..** If
28600 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
28610 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e  able btree, then
28620 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63   the content sec
28630 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49  tion is read.  I
28640 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69  f.** pCur is poi
28650 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  nting to an inde
28660 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68  x b-tree then th
28670 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73  e key section is
28680 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
28690 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
286a0 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c  load(), the call
286b0 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
286c0 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
286d0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
286e0 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61  id row in the ta
286f0 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65  ble.  For sqlite
28700 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28710 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63  cked(), the.** c
28720 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69  ursor might be i
28730 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20  nvalid or might 
28740 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f  need to be resto
28750 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
28760 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   read..**.** Ret
28770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
28780 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
28790 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
287a0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
287b0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
287c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
287d0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
287e0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
287f0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
28800 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28810 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42  e3BtreePayload(B
28820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28830 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28840 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
28870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28880 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28890 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
288a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
288b0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
288c0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
288d0 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
288e0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
288f0 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
28900 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
28910 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
28920 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
28930 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
28940 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71  is variant of sq
28950 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28960 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69  d() works even i
28970 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
28980 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43   not.** in the C
28990 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74  URSOR_VALID stat
289a0 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  e.  It is only u
289b0 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
289c0 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a  e3_blob_read().*
289d0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  * interface..*/.
289e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
289f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61  MIT_INCRBLOB.sta
28a00 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
28a10 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61  INE int accessPa
28a20 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20  yloadChecked(.  
28a30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  BtCursor *pCur,.
28a40 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20    u32 offset,.  
28a50 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20  u32 amt,.  void 
28a60 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72  *pBuf.){.  int r
28a70 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  c;.  if ( pCur->
28a80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28a90 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
28aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
28ab0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
28ac0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28ad0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  red(pCur) );.  r
28ae0 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
28af0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
28b00 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
28b10 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50  c ? rc : accessP
28b20 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
28b30 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
28b40 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
28b50 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28b60 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
28b70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28b80 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28b90 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75  pBuf){.  if( pCu
28ba0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28bb0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
28bc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28bd0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28be0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  );.    return ac
28bf0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
28c00 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28c10 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  Buf, 0);.  }else
28c20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  {.    return acc
28c30 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
28c40 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28c50 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a  amt, pBuf);.  }.
28c60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
28c70 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
28c80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
28c90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
28ca0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
28cb0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
28cc0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
28cd0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
28ce0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
28cf0 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
28d00 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
28d10 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
28d20 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
28d30 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
28d40 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
28d50 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
28d60 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
28d70 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
28d80 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
28d90 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
28da0 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
28db0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
28dc0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
28dd0 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
28de0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
28df0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
28e00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28e10 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
28e20 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
28e30 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
28e40 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
28e50 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
28e60 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
28e70 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
28e80 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
28e90 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
28ea0 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
28eb0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
28ec0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
28ed0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
28ee0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
28ef0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
28f00 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
28f10 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
28f20 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
28f30 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28f40 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
28f50 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
28f60 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
28f70 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
28f80 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
28f90 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
28fa0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
28fb0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
28fc0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
28fd0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
28fe0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
28ff0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
29000 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
29010 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
29020 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
29030 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
29040 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
29050 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
29060 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
29070 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
29080 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
29090 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
290a0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
290b0 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
290c0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
290d0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
290e0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
290f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  /.){.  int amt;.
29100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
29110 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
29120 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
29130 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
29140 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29150 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29160 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29170 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29180 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29190 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
291a0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
291b0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
291c0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
291d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
291e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
291f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
29200 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29210 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29220 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad>pCur->pPage->
29230 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
29240 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
29250 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29260 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65  load<pCur->pPage
29270 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
29280 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
29290 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
292a0 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28  cal;.  if( amt>(
292b0 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65  int)(pCur->pPage
292c0 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
292d0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
292e0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  ) ){.    /* Ther
292f0 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20  e is too little 
29300 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
29310 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74  e for the expect
29320 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a  ed amount.    **
29330 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e   of local conten
29340 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74  t. Database must
29350 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
29360 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
29370 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d  UPT_DB );.    am
29380 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29  t = MAX(0, (int)
29390 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
293a0 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
293b0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a  nfo.pPayload));.
293c0 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75    }.  *pAmt = (u
293d0 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e  32)amt;.  return
293e0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
293f0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
29400 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
29410 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
29420 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
29430 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
29440 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
29450 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
29460 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
29470 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
29480 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
29490 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
294a0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
294b0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
294c0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
294d0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
294e0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
294f0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
29500 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
29510 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
29520 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
29530 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
29540 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
29550 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
29560 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
29570 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
29580 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
29590 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
295a0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
295b0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
295c0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
295d0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
295e0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
295f0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
29600 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
29610 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
29620 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
29630 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
29640 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
29650 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29660 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
29670 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
29680 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
29690 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
296a0 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
296b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
296c0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
296d0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
296e0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
296f0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
29700 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
29710 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
29720 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
29730 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29740 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
29750 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
29760 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
29770 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
29780 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
29790 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
297a0 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
297b0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
297c0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
297d0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
297e0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
297f0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
29800 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
29810 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
29820 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
29830 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
29840 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
29850 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
29860 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
29870 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29880 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29890 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
298a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
298b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
298c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
298d0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
298e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
298f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
29900 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
29910 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
29920 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
29930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29940 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
29950 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29960 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
29970 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29980 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29990 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
299a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
299b0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
299c0 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50  >ix;.  pCur->apP
299d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
299e0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
299f0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
29a00 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
29a10 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64  .  return getAnd
29a20 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
29a30 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50  wPgno, &pCur->pP
29a40 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  age, pCur, pCur-
29a50 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
29a60 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29a70 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
29a80 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
29a90 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
29aa0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
29ab0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
29ac0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
29ad0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
29ae0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
29af0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
29b00 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
29b10 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
29b20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
29b30 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
29b40 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
29b50 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
29b60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
29b70 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
29b80 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
29b90 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
29ba0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
29bb0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
29bc0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
29bd0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
29be0 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
29bf0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
29c00 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
29c10 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
29c20 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
29c50 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
29c60 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
29c70 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
29c80 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
29c90 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
29ca0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
29cb0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
29cc0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
29cd0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
29ce0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
29cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29d00 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
29d10 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
29d20 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
29d30 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
29d40 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
29d50 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
29d60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
29d70 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
29d80 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
29d90 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
29da0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
29db0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
29dc0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
29dd0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
29de0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
29df0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
29e00 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29e10 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
29e20 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
29e30 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
29e40 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
29e50 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
29e60 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
29e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29e80 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
29e90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29ea0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b   MemPage *pLeaf;
29eb0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29ec0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29ed0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29ee0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29ef0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29f00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29f10 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
29f20 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
29f30 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
29f40 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
29f50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29f60 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
29f70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29f80 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
29f90 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  Cur->pPage->pgno
29fa0 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
29fb0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29fc0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
29fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29fe0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
29ff0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
2a000 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2a010 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a020 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2a030 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a040 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  );.  pCur->ix = 
2a050 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a060 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c  ->iPage-1];.  pL
2a070 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  eaf = pCur->pPag
2a080 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  e;.  pCur->pPage
2a090 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a0a0 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  --pCur->iPage];.
2a0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2a0c0 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a  Null(pLeaf);.}..
2a0d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a0e0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
2a0f0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2a100 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
2a110 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
2a120 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
2a130 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2a140 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
2a150 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
2a160 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
2a170 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2a180 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
2a190 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2a1a0 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
2a1b0 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
2a1c0 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
2a1d0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2a1e0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2a1f0 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
2a200 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
2a210 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2a220 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
2a230 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2a240 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
2a250 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
2a260 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
2a270 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2a280 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
2a290 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20  SOR_INVALID and 
2a2a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2a2b0 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54  urns SQLITE_EMPT
2a2c0 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  Y. Otherwise,.**
2a2d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
2a2e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
2a2f0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f  he first cell lo
2a300 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
2a310 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c  t.** (or virtual
2a320 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
2a330 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2a340 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
2a350 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
2a360 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2a370 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
2a380 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
2a390 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2a3a0 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
2a3b0 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
2a3c0 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
2a3d0 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
2a3e0 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
2a3f0 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
2a400 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
2a410 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
2a420 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
2a430 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
2a440 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
2a450 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2a460 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2a470 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
2a480 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
2a490 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
2a4a0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
2a4b0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2a4c0 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
2a4d0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a4e0 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
2a4f0 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
2a500 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
2a510 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
2a520 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
2a530 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a540 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
2a550 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
2a560 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2a570 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2a580 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2a590 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2a5a0 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
2a5b0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2a5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2a5d0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
2a5e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a5f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2a600 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
2a610 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2a620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a630 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52  ur->eState < CUR
2a640 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a650 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30  || pCur->iPage<0
2a660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a670 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c  ur->pgnoRoot>0 |
2a680 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20  | pCur->iPage<0 
2a690 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
2a6a0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2a6b0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
2a6c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2a6d0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
2a6e0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->pPage);.      
2a6f0 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69  while( --pCur->i
2a700 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2a710 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2a720 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
2a730 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
2a740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2a750 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2a760 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20  >apPage[0];.    
2a770 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74    goto skip_init
2a780 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2a790 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
2a7a0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
2a7b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a7c0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2a7d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
2a7e0 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PTY;.  }else{.  
2a7f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a800 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
2a810 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2a820 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2a830 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20  IRESEEK ){.     
2a840 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2a850 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2a860 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2a870 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2a880 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
2a890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2a8a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
2a8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2a8c0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2a8d0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
2a8e0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2a8f0 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
2a900 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
2a910 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
2a920 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20  ur->pPage,.     
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
2a950 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
2a960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a970 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2a980 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a990 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2a9a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2a9b0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2a9c0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2a9d0 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2a9e0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b  ->pPage->intKey;
2a9f0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
2aa00 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2aa10 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
2aa20 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
2aa30 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
2aa40 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
2aa50 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2aa60 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
2aa70 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
2aa80 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
2aa90 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
2aaa0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
2aab0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
2aac0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
2aad0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
2aae0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
2aaf0 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
2ab00 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
2ab10 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
2ab20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
2ab30 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
2ab40 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
2ab50 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
2ab60 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
2ab70 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
2ab80 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
2ab90 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
2aba0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
2abb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
2abc0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
2abd0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
2abe0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
2abf0 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
2ac00 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2ac10 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
2ac20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
2ac30 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
2ac40 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
2ac50 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
2ac60 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
2ac70 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
2ac80 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
2ac90 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
2aca0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
2acb0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
2acc0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
2acd0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
2ace0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
2acf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ad00 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43  _CORRUPT_PAGE(pC
2ad10 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ur->pPage);.  }.
2ad20 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2ad30 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2ad40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2ad50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2ad60 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2ad70 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2ad80 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2ad90 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2ada0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2adb0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
2adc0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
2add0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2ade0 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
2adf0 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
2ae00 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
2ae10 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
2ae20 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
2ae30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ae40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2ae50 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
2ae60 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
2ae70 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
2ae80 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2ae90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2aea0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
2aeb0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2aec0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
2aed0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
2aee0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2aef0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  INVALID;.    rc 
2af00 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
2af10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2af20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2af30 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2af40 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2af50 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2af60 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2af70 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2af80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2af90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2afa0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2afb0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2afc0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2afd0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2afe0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2aff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b000 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2b010 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b020 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2b030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b040 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b050 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b060 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b070 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b080 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b090 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b0a0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
2b0b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
2b0c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b0d0 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
2b0e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2b0f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2b100 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2b110 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2b120 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2b130 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b140 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2b150 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2b170 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2b180 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2b190 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b1a0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2b1b0 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2b1c0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2b1d0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2b1e0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2b1f0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2b200 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2b210 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2b220 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b230 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2b240 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2b250 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2b260 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2b270 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2b280 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2b290 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2b2a0 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2b2b0 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2b2c0 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2b2d0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2b2e0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2b2f0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2b300 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b320 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2b330 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b340 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2b350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b360 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b370 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2b380 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b390 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b3a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b3b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b3c0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2b3d0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2b3e0 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2b3f0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2b400 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b410 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b420 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2b430 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2b440 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2b450 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2b460 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2b470 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b480 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2b490 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2b4a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b4b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2b4c0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2b4d0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2b4e0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2b4f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2b500 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2b510 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2b520 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2b530 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2b540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2b550 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2b560 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2b570 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2b580 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2b590 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2b5a0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2b5b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2b5c0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2b5d0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2b5e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2b5f0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2b600 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2b610 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2b620 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2b630 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b640 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2b650 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2b660 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2b670 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2b680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b690 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2b6a0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2b6b0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52  ell>0 );.    *pR
2b6c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2b6d0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b6e0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pCur);.  }else i
2b6f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2b700 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2b710 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2b720 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2b730 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2b740 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2b750 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b760 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2b770 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2b780 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2b790 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2b7a0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2b7b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2b7c0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2b7d0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2b7e0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2b7f0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2b800 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2b810 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2b820 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2b830 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2b840 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
2b850 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2b860 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2b870 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
2b880 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b890 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b8a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b8b0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2b8c0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2b8d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2b8e0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
2b8f0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
2b900 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
2b910 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
2b920 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2b930 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
2b940 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2b950 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2b960 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2b970 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
2b980 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
2b990 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
2b9a0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
2b9b0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
2b9c0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
2b9d0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2b9e0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
2b9f0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
2ba00 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
2ba10 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2ba20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ba30 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
2ba40 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
2ba50 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
2ba60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2ba70 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  x==pCur->pPage->
2ba80 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2ba90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2baa0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  ge->leaf );.#end
2bab0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2bac0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2bad0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2bae0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2baf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bb00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bb10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2bb20 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65  ALID );.    *pRe
2bb30 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2bb40 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2bb50 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2bb60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bb70 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2bb80 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2bb90 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ast;.    }else{.
2bba0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2bbb0 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2bbc0 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Last;.    }.  }e
2bbd0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2bbe0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2bbf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2bc00 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2bc10 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2bc20 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2bc30 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2bc40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2bc50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2bc60 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2bc70 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2bc80 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2bc90 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2bca0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2bcb0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2bcc0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2bcd0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2bce0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2bcf0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2bd00 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2bd10 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2bd20 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2bd30 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2bd40 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2bd50 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2bd60 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2bd70 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2bd80 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2bd90 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2bda0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2bdb0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2bdc0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2bdd0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2bde0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2bdf0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2be00 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2be10 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2be20 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2be30 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2be40 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2be50 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2be60 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2be70 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2be80 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2be90 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2bea0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2beb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2bec0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2bed0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2bee0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2bef0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2bf00 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2bf10 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2bf20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2bf30 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2bf40 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2bf50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2bf60 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2bf70 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2bf80 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2bf90 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfb0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2bfc0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2bfd0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2bfe0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2bff0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2c000 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2c010 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2c020 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2c030 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2c040 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2c050 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2c060 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2c070 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2c080 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2c090 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2c0a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c0b0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2c0c0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2c0d0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2c0e0 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2c0f0 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2c100 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2c110 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2c120 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2c130 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2c140 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2c150 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2c160 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2c170 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2c180 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2c190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2c1a0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2c1b0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2c1c0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2c1d0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2c1e0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2c1f0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2c200 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2c210 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2c220 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2c230 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2c240 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2c250 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2c260 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2c270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2c280 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2c290 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2c2a0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2c2b0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2c2c0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2c2d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c2e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c2f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c300 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2c310 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2c320 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2c330 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2c340 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2c350 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2c360 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2c370 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c380 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2c390 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2c3a0 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2c3b0 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2c3c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2c3d0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2c3e0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2c3f0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2c400 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2c410 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2c420 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2c430 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2c440 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2c450 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c460 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2c470 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c480 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2c490 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2c4a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2c4b0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2c4c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c4d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c4e0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2c4f0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2c500 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2c510 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2c520 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2c530 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2c540 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c550 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c570 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2c580 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2c590 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2c5a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2c5b0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2c5c0 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2c5d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2c5e0 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2c5f0 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2c600 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2c610 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2c620 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2c630 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2c640 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2c650 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2c660 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2c670 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2c680 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2c690 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2c6a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2c6b0 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72  =intKey && !pCur
2c6c0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2c6d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c6e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c6f0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2c700 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2c710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c730 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2c740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c750 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2c760 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2c770 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c780 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2c7a0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2c7b0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2c7c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c7d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2c7e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2c7f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2c800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2c810 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2c820 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2c830 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2c840 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2c850 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2c860 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2c870 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2c880 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2c890 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2c8a0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2c8b0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2c8c0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2c8d0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2c8e0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2c8f0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2c900 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2c910 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2c920 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2c930 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2c940 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2c950 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c960 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2c970 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c980 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2c990 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2c9a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2c9b0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2c9c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c9d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
2c9e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2c9f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2ca00 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2ca10 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
2ca20 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2ca30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ca40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2ca50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2ca60 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
2ca70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ca80 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
2ca90 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2caa0 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2cab0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2cac0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2cad0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2cae0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2caf0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2cb00 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2cb10 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2cb20 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2cb30 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
2cb40 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2cb70 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2cb80 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2cb90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2cba0 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2cbb0 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2cbc0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2cbd0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2cbe0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2cbf0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2cc00 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2cc10 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2cc20 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2cc30 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2cc40 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2cc50 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2cc60 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2cc70 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2cc80 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2cc90 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2cca0 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2ccb0 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2ccc0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2ccd0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2cce0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2ccf0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2cd00 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2cd10 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2cd20 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2cd30 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2cd40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2cd50 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2cd60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2cd70 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2cd80 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2cd90 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2cda0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2cdb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2cdc0 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2cdd0 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2cde0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2cdf0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2ce00 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2ce10 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2ce20 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2ce30 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2ce40 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2ce50 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2ce60 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2ce70 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2ce80 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2ce90 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2cea0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2ceb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2cec0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2ced0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2cee0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2cef0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2cf00 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2cf10 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2cf30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2cf40 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2cf50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cf60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cf70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2cf80 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2cf90 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2cfa0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2cfb0 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2cfc0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2cfd0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2cfe0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2cff0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2d000 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d010 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2d020 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2d030 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2d040 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d050 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2d060 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2d070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2d080 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2d090 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2d0a0 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2d0b0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2d0c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d0d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2d0e0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2d0f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d100 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d110 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2d120 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d130 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2d140 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2d150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2d160 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2d170 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2d180 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2d190 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2d1a0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d1b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2d1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d1d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2d1f0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2d200 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2d210 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2d220 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2d230 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2d240 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d250 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2d260 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2d270 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2d280 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2d290 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2d2a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2d2b0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2d2c0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2d2d0 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2d2e0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2d2f0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2d300 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2d310 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2d320 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2d330 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2d340 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2d350 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2d360 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2d370 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2d380 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2d390 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2d3a0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2d3b0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2d3c0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2d3d0 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2d3e0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2d3f0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2d400 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2d410 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2d420 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2d430 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2d440 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2d450 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2d460 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2d470 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2d480 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2d490 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2d4a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d4b0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2d4c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2d4d0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2d4e0 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2d4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2d500 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2d510 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2d520 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2d530 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2d540 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2d550 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2d560 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2d570 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2d580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2d590 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2d5a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d5b0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2d5c0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d5d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d5e0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d5f0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d600 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2d610 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d620 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2d630 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2d640 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2d650 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2d660 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2d670 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2d680 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d690 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2d6a0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2d6b0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2d6c0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2d6d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2d6e0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2d6f0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2d700 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d710 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2d720 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2d730 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2d740 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d750 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d760 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2d770 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2d780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2d7a0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2d7b0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2d7c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2d7d0 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2d7e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2d7f0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2d800 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2d810 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2d820 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2d830 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2d840 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2d850 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2d860 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2d870 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2d880 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2d890 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2d8a0 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2d8b0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2d8c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2d8d0 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2d8e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2d8f0 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2d900 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2d910 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2d920 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2d930 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2d940 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2d950 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2d960 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2d970 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2d980 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2d990 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2d9a0 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2d9b0 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2d9c0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2d9d0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2d9e0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2d9f0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2da00 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2da10 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2da20 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2da30 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2da40 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2da50 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2da60 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2da70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2da80 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2da90 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2daa0 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2dab0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2dac0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2dad0 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2dae0 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2daf0 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2db00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2db10 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2db20 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2db30 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2db40 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2db50 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2db60 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2db70 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2db80 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2db90 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2dba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dbb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2dbc0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2dbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dbe0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2dbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dc00 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2dc10 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2dc20 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2dc30 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2dc40 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2dc50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dc60 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2dc70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2dc80 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2dc90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dca0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2dcb0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2dcc0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2dcd0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2dce0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2dcf0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2dd00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2dd10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2dd20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2dd30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2dd40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2dd50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2dd60 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2dd70 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2dd80 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2dd90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2dda0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2ddb0 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2ddc0 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2ddd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2dde0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2ddf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de00 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2de10 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2de20 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2de30 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2de40 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2de50 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2de60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2de70 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2de80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2de90 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2dea0 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2deb0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2dec0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2ded0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2dee0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2def0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2df00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2df10 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2df20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2df30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2df40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2df50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2df60 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2df70 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2df80 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2df90 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2dfa0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2dfb0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2dfc0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
2dfd0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2dfe0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
2dff0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2e000 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2e010 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2e020 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2e030 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2e040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e050 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2e060 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2e070 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2e080 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2e090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e0a0 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2e0b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e0c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e0d0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2e0e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
2e0f0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e100 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
2e110 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
2e120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e130 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2e140 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
2e150 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
2e160 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
2e170 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e180 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2e190 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2e1a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2e1b0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2e1c0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
2e1d0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2e1e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
2e1f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
2e200 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72  r->ix = (u16)lwr
2e210 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e220 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
2e230 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
2e240 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
2e250 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
2e260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2e270 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
2e280 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e290 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2e2a0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2e2b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2e2c0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2e2d0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2e2e0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2e2f0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2e300 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2e310 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2e320 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2e330 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2e340 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2e350 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2e360 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2e370 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2e380 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2e390 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2e3a0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2e3b0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2e3c0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2e3d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e3e0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2e3f0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2e400 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2e410 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2e420 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2e430 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2e440 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2e450 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2e460 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2e470 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2e480 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2e490 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2e4a0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2e4b0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2e4c0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2e4d0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2e4e0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
2e4f0 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74  eturn an estimat
2e500 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
2e510 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2e520 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20  table that pCur 
2e530 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
2e540 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  o.  Return a neg
2e550 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2e560 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  no estimate is c
2e570 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61  urrently .** ava
2e580 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73  ilable..*/.i64 s
2e590 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f  qlite3BtreeRowCo
2e5a0 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20  untEst(BtCursor 
2e5b0 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b  *pCur){.  i64 n;
2e5c0 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65  .  u8 i;..  asse
2e5d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2e5e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2e5f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e600 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2e610 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2e620 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  utex) );..  /* C
2e630 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e  urrently this in
2e640 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20  terface is only 
2e650 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50  called by the OP
2e660 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20  _IfSmaller.  ** 
2e670 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74  opcode, and it t
2e680 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72  hat case the cur
2e690 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  sor will always 
2e6a0 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a  be valid and.  *
2e6b0 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f  * will always po
2e6c0 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f  int to a leaf no
2e6d0 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  de. */.  if( NEV
2e6e0 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
2e6f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
2e700 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
2e710 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50  ( NEVER(pCur->pP
2e720 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  age->leaf==0) ) 
2e730 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20  return -1;..  n 
2e740 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  = pCur->pPage->n
2e750 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
2e760 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   i<pCur->iPage; 
2e770 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
2e780 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
2e790 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
2e7a0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
2e7b0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2e7c0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2e7d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2e7e0 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  base. .** Return
2e7f0 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
2e800 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
2e810 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
2e820 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20  SQLITE_DONE     
2e830 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2e840 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  dy pointing at t
2e850 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a  he last element.
2e860 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  **    otherwise 
2e870 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64         some kind
2e880 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2e890 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2e8a0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2e8b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2e8c0 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
2e8d0 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2e8e0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2e8f0 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2e900 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2e910 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2e920 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2e930 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
2e940 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2e950 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2e960 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
2e970 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
2e980 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2e990 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2e9a0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2e9b0 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
2e9c0 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
2e9d0 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2e9e0 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
2e9f0 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  the F argument i
2ea00 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2ea10 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  xt(C,F) is 1, th
2ea20 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  en the.** cursor
2ea30 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2ea40 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2ea50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2ea60 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2ea70 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2ea80 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2ea90 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2eaa0 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2eab0 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20  nt.** is a hint 
2eac0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2ead0 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  .  SQLite btree 
2eae0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2eaf0 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74  oes not use.** t
2eb00 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
2eb10 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
2eb20 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2eb30 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2eb40 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2eb50 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
2eb60 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2eb70 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2eb80 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2eb90 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2eba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ebb0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2ebc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2ebd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2ebe0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ebf0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ec00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2ec10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ec20 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2ec30 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2ec40 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2ec50 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2ec60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ec70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2ec80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2ec90 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2eca0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ecb0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2ecc0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2ecd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2ece0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2ecf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ed00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ed10 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2ed20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ed30 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2ed40 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ed50 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2ed60 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2ed70 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2ed80 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ed90 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2eda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2edb0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2edc0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2edd0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2ede0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2edf0 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b  pPage;.  idx = +
2ee00 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73  +pCur->ix;.  ass
2ee10 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2ee20 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
2ee30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ee40 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
2ee50 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2ee60 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
2ee70 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
2ee80 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
2ee90 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
2eea0 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
2eeb0 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
2eec0 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
2eed0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
2eee0 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
2eef0 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
2ef00 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
2ef10 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
2ef20 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
2ef30 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
2ef40 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
2ef50 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
2ef60 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
2ef70 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
2ef80 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
2ef90 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
2efa0 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
2efb0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
2efc0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2efd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
2efe0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2eff0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2f000 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2f010 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2f020 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f030 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
2f040 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2f050 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2f060 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
2f070 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2f080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2f090 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2f0a0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2f0b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f0c0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
2f0d0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2f0e0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2f0f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f100 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
2f110 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
2f120 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2f130 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2f140 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f150 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f160 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
2f170 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2f180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f190 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2f1a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f1c0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f1d0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f1e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f1f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f200 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2f210 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
2f220 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2f230 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Page;.  UNUSED_P
2f240 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
2f250 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
2f260 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
2f270 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
2f280 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f290 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f2a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2f2b0 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2f2c0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2f2d0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f2e0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f2f0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f300 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2f310 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2f320 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f330 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2f340 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2f350 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2f360 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f370 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2f380 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70  eNext(pCur);.  p
2f390 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f3a0 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  ge;.  if( (++pCu
2f3b0 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e  r->ix)>=pPage->n
2f3c0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2f3d0 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75  ->ix--;.    retu
2f3e0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2f3f0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
2f400 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f420 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f430 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f440 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2f460 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f470 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2f480 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2f490 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
2f4a0 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
2f4b0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2f4c0 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a  OK     success.*
2f4d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  *     SQLITE_DON
2f4e0 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69  E   the cursor i
2f4f0 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  s already on the
2f500 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
2f510 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
2f520 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2f530 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2f540 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2f550 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f560 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f570 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2f580 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2f590 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2f5a0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2f5b0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
2f5c0 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
2f5d0 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2f5e0 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2f5f0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
2f600 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2f610 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2f620 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
2f630 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
2f640 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f650 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2f660 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2f670 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2f680 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
2f690 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2f6a0 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2f6b0 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2f6c0 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
2f6d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46  treePrevious(C,F
2f6e0 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20  ) is 1, then.** 
2f6f0 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
2f700 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2f710 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2f720 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2f730 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2f740 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2f750 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2f760 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2f770 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e F argument is 
2f780 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65  a.** hint to the
2f790 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65   implement.  The
2f7a0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62   native SQLite b
2f7b0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2f7c0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ion does not.** 
2f7d0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62  use this hint, b
2f7e0 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2f7f0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2f800 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2f810 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f820 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2f830 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2f840 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2f850 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2f860 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2f870 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f880 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2f890 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f8a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2f8b0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2f8c0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2f8d0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2f8e0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2f8f0 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2f900 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2f910 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2f920 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2f930 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2f940 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2f950 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2f960 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2f970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f980 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f990 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2f9a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2f9b0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2f9c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f9d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2f9e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f9f0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2fa00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2fa10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2fa20 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2fa30 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2fa40 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2fa50 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2fa60 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2fa70 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2fa80 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
2fa90 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2faa0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2fab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2fac0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2fad0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2fae0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2faf0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fb00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fb10 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2fb20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2fb30 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2fb40 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
2fb50 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fb60 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2fb70 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2fb80 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2fb90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2fba0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2fbb0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2fbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2fbd0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
2fbe0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2fbf0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2fc00 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2fc10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2fc20 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2fc30 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2fc40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2fc50 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2fc60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2fc70 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2fc80 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2fc90 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2fca0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2fcb0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2fcc0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  ..    pCur->ix--
2fcd0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2fce0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
2fcf0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2fd00 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2fd10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2fd20 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2fd30 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ous(pCur, 0);.  
2fd40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2fd50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fd60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2fd70 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
2fd80 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2fd90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2fda0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
2fdb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2fdc0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2fdd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
2fde0 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
2fdf0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2fe00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2fe10 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2fe20 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2fe30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2fe40 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20  ETER( flags );  
2fe50 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42  /* Used in COMDB
2fe60 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65  2 but not native
2fe70 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75   SQLite */.  pCu
2fe80 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2fe90 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2fea0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2feb0 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2fec0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2fed0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2fee0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2fef0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2ff00 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  ->ix==0.   || pC
2ff10 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
2ff20 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2ff30 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2ff40 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43  (pCur);.  }.  pC
2ff50 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75  ur->ix--;.  retu
2ff60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ff70 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2ff80 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2ff90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ffa0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2ffb0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2ffc0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2ffd0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2ffe0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2fff0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
30000 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
30010 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
30020 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
30030 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
30040 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
30050 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
30060 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
30070 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
30080 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
30090 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
300a0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
300b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
300c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
300d0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
300e0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
300f0 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
30100 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
30110 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
30120 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
30130 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
30140 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
30150 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
30160 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
30170 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
30180 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
30190 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
301a0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
301b0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
301c0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
301d0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
301e0 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
301f0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
30200 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30210 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
30220 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
30230 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
30240 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
30250 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
30260 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
30270 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
30280 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
30290 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
302a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
302b0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
302c0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
302d0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
302e0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
302f0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
30300 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
30310 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
30320 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
30330 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
30340 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
30350 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
30360 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
30370 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
30380 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
30390 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
303a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
303b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
303c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
303d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
303e0 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
303f0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
30400 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
30410 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
30420 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
30430 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
30440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
30450 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
30460 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
30470 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
30480 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
30490 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
304a0 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
304b0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
304c0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
304d0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
304e0 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
304f0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
30500 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
30510 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
30520 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30530 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
30540 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
30550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30560 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
30570 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
30580 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
30590 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
305a0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
305b0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
305c0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
305d0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
305e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
305f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
30600 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30610 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
30620 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
30630 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
30640 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
30650 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
30660 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
30670 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
30680 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
30690 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
306a0 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Bt);.  /* EVIDEN
306b0 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30  CE-OF: R-05119-0
306c0 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20  2637 The 4-byte 
306d0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
306e0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a  er at offset 36.
306f0 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72    ** stores stor
30700 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  es the total num
30710 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
30720 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f  the freelist. */
30730 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
30740 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30750 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
30760 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
30770 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
30780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
30790 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
307a0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
307b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
307c0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
307d0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
307e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
307f0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
30800 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
30810 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
30820 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
30830 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
30840 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
30850 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e  by' */.    u32 n
30860 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a  Search = 0;   /*
30870 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   Count of the nu
30880 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61  mber of search a
30890 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a  ttempts */.    .
308a0 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
308b0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
308c0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
308d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
308e0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
308f0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
30900 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
30910 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
30920 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
30930 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
30940 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
30950 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
30960 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
30970 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30980 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
30990 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
309a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
309b0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
309c0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
309d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
309e0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
309f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
30a00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
30a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
30a20 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
30a30 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
30a40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
30a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30a60 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
30a70 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
30a80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
30a90 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
30aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30ab0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
30ac0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
30ad0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
30ae0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
30af0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
30b00 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
30b10 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
30b20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
30b30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
30b40 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
30b50 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
30b60 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
30b70 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
30b80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30b90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30ba0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30bb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30bc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
30bd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30be0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
30bf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
30c00 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
30c10 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
30c20 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
30c30 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
30c40 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
30c50 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
30c60 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
30c70 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
30c80 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
30c90 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
30ca0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
30cb0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
30cc0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
30cd0 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
30ce0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
30cf0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
30d00 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
30d10 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
30d20 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
30d30 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
30d40 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
30d50 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
30d60 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
30d70 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
30d80 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
30d90 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
30da0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
30db0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
30dc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
30dd0 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
30de0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
30df0 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
30e00 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
30e10 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
30e20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30e30 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
30e40 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
30e50 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
30e60 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
30e70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
30e80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
30e90 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
30ea0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
30eb0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
30ec0 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
30ed0 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
30ee0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
30ef0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
30f00 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
30f10 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
30f20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
30f30 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
30f40 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
30f50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
30f60 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
30f70 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
30f80 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
30f90 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
30fa0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c  iTrunk>mxPage ||
30fb0 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29   nSearch++ > n )
30fc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
30fd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
30fe0 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f 20  NO(pPrevTrunk ? 
30ff0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f  pPrevTrunk->pgno
31000 20 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 1);.      }el
31010 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
31020 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31030 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
31040 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
31050 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
31070 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
31080 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31090 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
310a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
310b0 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
310c0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
310d0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
310e0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
310f0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
31100 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
31110 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
31120 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
31130 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
31140 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
31150 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
31160 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
31170 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
31180 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
31190 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
311a0 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
311b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
311c0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
311d0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
311e0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
311f0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
31200 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
31210 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
31220 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
31230 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
31240 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
31250 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
31260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
31270 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
31280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31290 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
312a0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
312b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
312c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
312d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
312e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
312f0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
31300 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
31310 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
31320 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
31330 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
31340 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
31350 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
31360 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
31370 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
31380 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
31390 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
313a0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
313b0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
313c0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
313d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
313e0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
313f0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
31400 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
31410 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
31420 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
31430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
31440 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
31450 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
31460 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31470 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
31480 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31490 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
314a0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
314b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
314c0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
314d0 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
314e0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
314f0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
31500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
31510 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
31520 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
31530 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
31540 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
31550 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
31560 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
31570 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
31580 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31590 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
315a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
315b0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
315c0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
315d0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
315e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
315f0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
31600 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31610 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31620 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31630 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31650 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
31660 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
31670 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
31680 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
31690 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
316a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
316b0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
316c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
316d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
316e0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
316f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31700 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31730 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31740 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31760 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
31770 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31780 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31790 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
317a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
317b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
317c0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
317d0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
317e0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
317f0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
31800 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
31810 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
31820 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
31830 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
31840 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
31850 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
31860 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
31870 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
31880 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
31890 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
318a0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
318b0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
318c0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
318d0 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
318e0 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
318f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31900 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
31910 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
31920 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31930 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31950 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
31960 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
31970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
31980 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
31990 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
319a0 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
319b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
319c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
319d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
319e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
319f0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
31a00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31a10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31a20 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
31a30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31a40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31a50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31a60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
31a70 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31a80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31a90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31ab0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
31ac0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31ad0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
31ae0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
31af0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
31b00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
31b10 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
31b20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
31b30 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
31b40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
31b50 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
31b60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31b70 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
31b80 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
31b90 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
31ba0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
31bb0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31bc0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
31bd0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
31be0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
31bf0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
31c00 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
31c10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
31c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31c30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31c40 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
31c50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31c60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
31c80 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
31c90 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
31ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
31cb0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
31cc0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31cd0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
31ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31cf0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
31d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
31d10 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
31d20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
31d30 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
31d40 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
31d50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
31d60 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
31d70 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
31d80 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
31d90 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
31da0 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
31db0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
31dc0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
31dd0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
31de0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
31df0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
31e00 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
31e10 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
31e20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
31e30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31e40 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31e50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
31e60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
31e70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
31e80 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
31e90 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
31ea0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
31eb0 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
31ec0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
31ed0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
31ee0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
31ef0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31f00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31f30 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
31f40 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
31f50 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
31f60 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
31f70 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
31f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
31f90 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
31fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
31fb0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
31fc0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
31fd0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
31fe0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
31ff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
32000 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
32010 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
32020 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
32030 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
32040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
32050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32080 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
32090 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
320a0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
320b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
320c0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
320d0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
320e0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
320f0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
32100 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
32110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32120 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72  CORRUPT_PGNO(iTr
32130 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32140 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32150 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32160 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
32170 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
32180 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
32190 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
321a0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
321b0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
321c0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
321d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
321e0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
321f0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
32200 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
32210 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
32220 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
32230 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
32240 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
32250 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32270 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
32280 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
32290 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
322a0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
322b0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
322c0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
322d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
322e0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
322f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32300 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32310 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32320 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
32330 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
32340 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
32350 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
32360 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
32370 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
32380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32390 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
323a0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
323b0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
323c0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
323d0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
323e0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
323f0 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
32400 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
32410 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
32420 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
32430 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
32440 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
32450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32460 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32470 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32480 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
32490 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
324a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
324b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
324c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
324d0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
324e0 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
324f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
32510 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
32520 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
32530 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32540 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32550 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
32560 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
32570 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
32580 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
32590 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
325a0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
325b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
325c0 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
325d0 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
325e0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
325f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32600 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
32610 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
32620 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
32630 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
32640 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
32650 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
32660 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
32670 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
32680 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
32690 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
326a0 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
326b0 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
326c0 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
326d0 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
326e0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
326f0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
32700 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
32710 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
32720 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
32730 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
32740 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
32750 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
32760 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
32770 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
32780 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
32790 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
327a0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
327b0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
327c0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
327d0 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
327e0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
327f0 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
32800 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
32810 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
32820 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
32830 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
32840 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
32850 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
32860 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
32870 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
32880 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
32890 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
328a0 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
328b0 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
328c0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
328d0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
328e0 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
328f0 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
32900 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
32910 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
32920 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
32930 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
32940 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
32950 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
32960 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
32970 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
32980 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
32990 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
329a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
329b0 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
329c0 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
329d0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f  ->bDoTruncate))?
329e0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
329f0 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20  TENT:0;..    rc 
32a00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32a10 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
32a20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
32a30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32a40 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
32a50 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
32a60 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
32a70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32a80 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
32a90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32aa0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32ab0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
32ac0 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
32ad0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
32ae0 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
32af0 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
32b00 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
32b10 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
32b20 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
32b30 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
32b40 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
32b50 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
32b60 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
32b70 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
32b80 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
32b90 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
32ba0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
32bb0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
32bc0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
32bd0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
32be0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
32bf0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32c00 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
32c10 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
32c20 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
32c30 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
32c40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
32c50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
32c60 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
32c70 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
32c80 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32c90 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
32ca0 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
32cb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32ce0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
32cf0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32d00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32d10 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
32d20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32d30 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
32d40 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
32d50 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
32d60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32d70 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
32d80 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
32d90 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
32da0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
32db0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
32dc0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
32dd0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
32de0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
32df0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
32e00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32e10 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
32e20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
32e30 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
32e40 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
32e50 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
32e60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32e80 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
32e90 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
32ea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
32ec0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
32ed0 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
32ee0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  = 0;.    }.    T
32ef0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32f00 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
32f10 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
32f20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
32f30 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
32f40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
32f50 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
32f60 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
32f70 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
32f80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
32f90 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65  evTrunk);.  asse
32fa0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
32fb0 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
32fc0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
32fd0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
32fe0 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  )<=1 );.  assert
32ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33000 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  || (*ppPage)->is
33010 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Init==0 );.  ret
33020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33030 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
33040 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
33050 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
33060 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
33070 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
33080 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
33090 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
330a0 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
330b0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
330c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
330d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
330e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
330f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
33100 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
33110 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
33120 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
33130 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
33140 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
33150 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
33160 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
33170 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
33180 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
33190 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
331a0 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
331b0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
331c0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
331d0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
331e0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
331f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
33200 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
33210 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
33220 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
33230 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
33240 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
33250 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
33260 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
33270 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
33280 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
33290 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
332a0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
332b0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
332c0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
332d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
332e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
332f0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
33300 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
33310 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
33320 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
33330 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
33340 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
33350 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
33360 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
33370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33380 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
33390 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
333a0 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
333d0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
333e0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
333f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33400 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
33410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
33420 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
33430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33440 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
33450 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
33460 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
33470 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  || iPage>1 );.  
33480 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
33490 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
334a0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
334b0 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72   if( iPage<2 ) r
334c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
334d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28  RUPT_BKPT;.  if(
334e0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
334f0 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
33500 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
33510 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
33520 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
33530 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
33540 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
33550 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
33560 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
33570 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
33580 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
33590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
335a0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
335b0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
335c0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
335d0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
335e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
335f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
33600 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
33610 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
33620 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
33630 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
33640 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
33650 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
33660 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
33670 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
33680 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
33690 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
336a0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
336b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
336c0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
336d0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
336e0 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
336f0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
33700 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
33710 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
33720 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
33730 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33740 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
33750 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
33760 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
33770 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
33780 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
33790 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
337a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
337b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
337c0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
337d0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
337e0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
337f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33800 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
33810 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
33820 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
33830 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
33840 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
33850 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
33860 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
33870 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
33880 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
33890 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
338a0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
338b0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
338c0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
338d0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
338e0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
338f0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
33900 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
33910 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
33920 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
33930 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
33940 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
33950 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
33960 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
33970 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
33980 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
33990 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
339a0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
339b0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
339c0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
339d0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
339e0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
339f0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
33a00 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
33a10 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
33a20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
33a30 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
33a40 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
33a50 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
33a60 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
33a70 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
33a80 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
33a90 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
33aa0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
33ab0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33ac0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
33ad0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33ae0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
33af0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
33b00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
33b20 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33b30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
33b40 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
33b50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
33b60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
33b70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
33b80 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
33b90 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
33ba0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
33bb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
33bc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33bd0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
33be0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
33bf0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
33c00 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
33c10 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
33c20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
33c30 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
33c40 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
33c50 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
33c60 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
33c70 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
33c80 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
33c90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
33ca0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
33cb0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
33cc0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
33cd0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
33ce0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
33cf0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
33d00 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
33d10 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
33d20 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
33d30 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
33d40 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
33d50 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
33d60 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
33d70 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
33d80 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
33d90 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
33da0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
33db0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
33dc0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
33dd0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
33de0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
33df0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
33e00 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
33e10 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
33e20 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
33e30 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
33e40 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
33e50 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
33e60 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
33e70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
33e80 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
33e90 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
33ea0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
33eb0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
33ec0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
33ed0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
33ee0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
33ef0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
33f00 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
33f10 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
33f20 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
33f30 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
33f40 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
33f50 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
33f60 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
33f70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33f80 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
33f90 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
33fa0 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
33fb0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
33fc0 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
33fd0 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
33fe0 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
33ff0 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
34000 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
34010 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
34020 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
34030 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
34040 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
34050 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
34060 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
34070 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
34080 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
34090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
340a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
340b0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
340c0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
340d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
340e0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
340f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
34100 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
34110 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
34120 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
34130 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
34140 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34150 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
34160 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
34170 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
34180 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
34190 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
341a0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
341b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
341c0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
341d0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
341e0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
341f0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
34200 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
34210 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
34220 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
34230 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
34240 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
34250 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34260 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
34270 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
34280 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
34290 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
342a0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
342b0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
342c0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
342d0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
342e0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
342f0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
34300 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
34310 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
34320 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
34330 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
34340 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
34350 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
34360 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
34370 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
34380 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
34390 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
343a0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
343b0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
343c0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
343d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
343e0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
343f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
34400 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
34410 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
34420 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34430 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
34440 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34450 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34460 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
34470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
34480 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34490 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
344a0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
344b0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
344c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
344d0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
344e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
344f0 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
34500 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
34510 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
34520 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
34530 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
34540 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
34550 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
34560 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
34570 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
34580 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
34590 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
345a0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
345b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
345c0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
345d0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
345e0 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
345f0 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
34600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34610 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
34620 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
34630 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
34640 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
34650 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
34660 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
34670 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
34680 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a  n Cell.  Store.*
34690 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * size informati
346a0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
346b0 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73  l in pInfo..*/.s
346c0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
346d0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
346e0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
346f0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
34700 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
34710 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
34720 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
34730 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
34740 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
34750 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
34760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
34770 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
34780 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29  ut the cell */.)
34790 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
347a0 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  t;.  Pgno ovflPg
347b0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
347c0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32  int nOvfl;.  u32
347d0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
347e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
347f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
34800 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
34810 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  );.  pPage->xPar
34820 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
34830 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69  ell, pInfo);.  i
34840 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  f( pInfo->nLocal
34850 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61  ==pInfo->nPayloa
34860 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
34870 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
34880 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
34890 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
348a0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
348b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
348c0 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d  ll+pInfo->nSize-
348d0 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  1 > pPage->aData
348e0 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
348f0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20   ){.    /* Cell 
34900 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
34910 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   of page */.    
34920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34930 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
34940 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  );.  }.  ovflPgn
34950 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
34960 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
34970 65 20 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20  e - 4);.  pBt = 
34980 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
34990 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
349a0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
349b0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
349c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
349d0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
349e0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
349f0 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
34a00 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
34a10 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
34a20 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
34a30 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
34a40 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
34a50 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
34a60 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
34a70 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
34a80 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
34a90 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
34aa0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
34ab0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
34ac0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
34ad0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
34ae0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
34af0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
34b00 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
34b10 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
34b20 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
34b30 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
34b40 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
34b50 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
34b60 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
34b70 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
34b80 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
34b90 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
34ba0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
34bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34bc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
34bd0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
34be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
34bf0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
34c00 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
34c10 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
34c20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
34c30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
34c40 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
34c50 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
34c60 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
34c70 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
34c80 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
34c90 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
34ca0 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
34cb0 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
34cc0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
34cd0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
34ce0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
34cf0 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
34d00 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
34d10 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
34d20 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
34d30 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
34d40 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
34d50 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
34d60 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
34d70 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
34d80 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
34d90 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
34da0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
34db0 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
34dc0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
34dd0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
34de0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
34df0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
34e00 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
34e10 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
34e20 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
34e30 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
34e40 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
34e50 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
34e60 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
34e70 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
34e80 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
34e90 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
34ea0 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
34eb0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
34ec0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
34ed0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
34ee0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
34ef0 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
34f00 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
34f10 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
34f20 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
34f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
34f40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34f50 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
34f60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
34f70 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
34f80 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
34f90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
34fa0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
34fb0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
34fc0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
34fd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
34fe0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34ff0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
35000 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
35010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
35020 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
35030 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
35040 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
35050 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
35060 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
35070 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
35080 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
35090 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
350a0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
350b0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
350c0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
350d0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
350e0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
350f0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
35100 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
35110 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
35120 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
35130 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
35140 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
35150 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
35160 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
35170 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
35180 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
35190 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
351a0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
351b0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
351c0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
351d0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
351e0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
351f0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
35200 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
35210 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
35220 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
35230 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
35240 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
35250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35260 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
35270 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
35280 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35290 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
352a0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
352b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
352c0 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
352d0 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
352e0 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
352f0 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
35300 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
35310 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35330 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
35340 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
35350 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
35360 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
35370 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
35380 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70  rc, mn;.  int sp
35390 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
353a0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a  ge *pToRelease;.
353b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
353c0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
353d0 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
353e0 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
353f0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
35400 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61  Ovfl;.  int nHea
35410 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
35420 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35430 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35440 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
35450 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
35460 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
35470 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
35480 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
35490 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
354a0 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
354b0 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
354c0 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
354d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
354e0 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
354f0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
35500 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42  >aData[pPage->pB
35510 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
35520 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
35530 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35540 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35550 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
35560 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
35570 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
35580 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
35590 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
355a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
355b0 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
355c0 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
355d0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
355e0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
355f0 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
35600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35610 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
35620 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
35630 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
35640 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
35650 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
35660 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
35670 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
35680 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
35690 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
356a0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
356b0 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
356c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
356d0 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
356e0 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
356f0 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
35700 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
35710 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
35720 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
35730 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
35740 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
35750 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
35760 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
35770 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
35780 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70  e payload */.  p
35790 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
357a0 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28  [nHeader];.  if(
357b0 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
357c0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
357d0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
357e0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
357f0 72 65 20 65 76 65 72 79 74 68 69 6e 67 20 66 69  re everything fi
35800 74 73 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  ts on the btree 
35810 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  page.    ** and 
35820 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
35830 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 20  s are required. 
35840 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  */.    n = nHead
35850 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
35860 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
35870 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
35880 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
35890 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
358a0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
358b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 72  .    assert( nSr
358c0 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  c<=nPayload );. 
358d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 72     testcase( nSr
358e0 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  c<nPayload );.  
358f0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
35900 64 2c 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a  d, pSrc, nSrc);.
35910 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
35920 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61  oad+nSrc, 0, nPa
35930 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20  yload-nSrc);.   
35940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
35950 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
35960 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
35970 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
35980 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  at some of the c
35990 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64  ontent will need
359a0 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f  .  ** to spill o
359b0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
359c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20  es..  */.  mn = 
359d0 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
359e0 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61  .  n = mn + (nPa
359f0 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
35a00 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
35a10 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65  eSize - 4);.  te
35a20 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
35a30 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
35a40 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
35a50 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
35a60 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67  ;.  if( n > pPag
35a70 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
35a80 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66  = mn;.  spaceLef
35a90 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65  t = n;.  *pnSize
35aa0 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
35ab0 20 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26   4;.  pPrior = &
35ac0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
35ad0 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d  ;.  pToRelease =
35ae0 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d   0;.  pgnoOvfl =
35af0 20 30 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   0;.  pBt = pPag
35b00 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74  e->pBt;..  /* At
35b10 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
35b20 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
35b30 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
35b40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
35b50 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
35b60 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
35b70 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
35b80 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
35b90 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
35ba0 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
35bb0 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
35bc0 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
35bd0 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
35be0 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
35bf0 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
35c00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
35c10 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
35c20 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
35c30 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
35c40 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
35c50 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
35c60 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
35c70 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
35c80 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
35c90 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
35ca0 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
35cb0 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
35cc0 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
35cd0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
35ce0 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
35cf0 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
35d00 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
35d10 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
35d20 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
35d30 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
35d40 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
35d50 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
35d60 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
35d70 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
35d80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
35d90 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35da0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
35db0 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
35dc0 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
35dd0 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
35de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
35df0 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
35e00 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
35e10 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
35e20 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
35e30 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
35e40 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
35e50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
35e60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
35e70 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
35e80 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
35e90 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
35ea0 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
35eb0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
35ec0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
35ed0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
35ee0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
35ef0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
35f00 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
35f10 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
35f20 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
35f30 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
35f40 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
35f50 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
35f60 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
35f70 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
35f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
35f90 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
35fa0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35fb0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
35fc0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
35fd0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
35fe0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
35ff0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
36000 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
36010 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
36020 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
36030 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
36040 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
36050 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
36060 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
36070 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
36080 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
36090 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
360a0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
360b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
360c0 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b    if( nSrc>=n ){
360d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
360e0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
360f0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
36100 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
36110 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
36120 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
36130 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
36140 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
36150 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
36160 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
36170 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
36180 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30   if( nPayload<=0
36190 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50   ) break;.    pP
361a0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
361b0 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
361c0 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
361d0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
361e0 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
361f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  ==0 ){.      Mem
36200 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
36210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36220 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
36230 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
36240 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
36250 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
36260 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
36270 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
36280 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
36290 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
362a0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
362b0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
362c0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
362d0 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
362e0 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
362f0 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
36300 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
36310 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
36320 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
36330 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
36340 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
36350 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
36360 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
36370 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
36380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36390 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
363a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
363b0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
363c0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
363d0 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
363e0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
363f0 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
36400 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
36410 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
36420 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
36430 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
36440 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
36450 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
36460 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
36470 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
36480 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
36490 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
364a0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
364b0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
364c0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
364d0 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
364e0 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
364f0 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
36500 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
36510 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
36520 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
36530 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
36540 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
36550 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
36560 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
36570 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
36580 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
36590 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
365a0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
365b0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
365c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
365d0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
365e0 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
365f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
36600 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
36610 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
36620 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
36630 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
36640 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
36650 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
36660 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
36670 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
36680 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
36690 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
366a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
366b0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
366c0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
366d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
366e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
366f0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
36700 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
36710 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
36720 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
36730 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
36740 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
36750 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
36760 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
36770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
36780 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
36790 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
367a0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
367b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
367c0 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
367d0 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
367e0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
367f0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
36800 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
36810 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
36820 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
36830 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
36840 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
36850 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
36860 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
36870 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
36880 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36890 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
368a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
368b0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
368c0 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
368d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
368e0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
368f0 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
36900 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
36910 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
36920 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
36930 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
36940 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
36950 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
36960 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
36970 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
36980 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
36990 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
369a0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
369b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
369c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
369d0 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
369e0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
369f0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
36a00 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
36a10 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
36a20 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
36a30 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
36a40 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
36a50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
36a60 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
36a70 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
36a80 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
36a90 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
36aa0 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
36ab0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
36ac0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
36ad0 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
36ae0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
36af0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
36b00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36b10 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
36b20 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
36b30 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
36b40 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
36b50 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
36b60 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
36b70 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
36b80 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
36b90 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
36ba0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
36bb0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
36bc0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
36bd0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
36be0 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
36bf0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
36c00 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
36c10 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
36c20 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
36c30 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
36c40 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
36c50 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
36c60 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
36c70 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
36c80 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36c90 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
36ca0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
36cb0 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
36cc0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
36cd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36ce0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36cf0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36d00 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36d10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
36d20 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
36d30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
36d40 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
36d50 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
36d60 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
36d70 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
36d80 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
36d90 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
36da0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
36db0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
36dc0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
36dd0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
36de0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
36df0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
36e00 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  ( pc+sz > pPage-
36e10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36e20 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
36e30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
36e40 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
36e50 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
36e60 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
36e70 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
36e80 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
36e90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
36ea0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
36eb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
36ec0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
36ed0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
36ee0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
36ef0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
36f00 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
36f10 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
36f20 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36f30 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
36f40 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
36f50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
36f60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
36f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36f80 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
36f90 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
36fa0 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
36fb0 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
36fc0 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
36fd0 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
36fe0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
36ff0 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
37000 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
37010 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
37020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
37030 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
37040 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
37050 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
37060 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
37070 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
37080 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
37090 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
370a0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
370b0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
370c0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
370d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
370e0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
370f0 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
37100 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
37110 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
37120 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
37130 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
37140 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
37150 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
37160 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
37170 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
37180 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37190 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
371a0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
371b0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
371c0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
371d0 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
371e0 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
371f0 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
37200 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
37210 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
37220 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
37230 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43  nted..**.** *pRC
37240 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f   must be SQLITE_
37250 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  OK when this rou
37260 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
37270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
37280 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
37290 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
372a0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
372b0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
372c0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
372d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
372e0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
372f0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
37300 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
37310 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
37320 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
37330 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
37340 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
37350 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
37360 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
37370 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
37380 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
37390 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
373a0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
373b0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
373c0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
373d0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
373e0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
373f0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
37400 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
37410 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
37420 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
37430 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
37440 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
37450 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
37460 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
37470 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
37480 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
37490 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
374a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
374b0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
374c0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
374d0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
374e0 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
374f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
37500 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
37510 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
37520 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
37530 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  */..  assert( *p
37540 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  RC==SQLITE_OK );
37550 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
37560 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
37570 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
37580 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
37590 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
375a0 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
375b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
375c0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
375d0 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
375e0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
375f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
37600 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
37610 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
37620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
37630 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
37640 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
37650 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
37660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
37670 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37680 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
37690 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
376a0 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
376b0 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
376c0 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
376d0 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
376e0 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
376f0 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
37700 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
37710 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
37720 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
37730 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
37740 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
37750 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
37760 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
37770 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
37780 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
37790 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
377a0 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
377b0 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
377c0 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
377d0 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
377e0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
377f0 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
37800 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
37810 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
37820 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
37830 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
37840 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
37850 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
37860 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
37870 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
37880 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
37890 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
378a0 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
378b0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
378c0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
378d0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
378e0 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
378f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
37900 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37910 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  ++;.    /* Compa
37920 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72  rison against Ar
37930 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20  raySize-1 since 
37940 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65  we hold back one
37950 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20   extra slot.    
37960 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65  ** as a continge
37970 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ncy.  In other w
37980 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64  ords, never need
37990 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65   more than 3 ove
379a0 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f  rflow.    ** slo
379b0 74 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c  ts but 4 are all
379c0 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20  ocated, just to 
379d0 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20  be safe. */.    
379e0 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61  assert( j < Arra
379f0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
37a00 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50  vfl)-1 );.    pP
37a10 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
37a20 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
37a30 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
37a40 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
37a50 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
37a60 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
37a70 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
37a80 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
37a90 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
37aa0 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
37ab0 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
37ac0 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
37ad0 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
37ae0 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
37af0 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
37b00 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
37b10 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
37b20 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
37b30 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
37b40 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
37b50 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
37b60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
37b70 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
37b80 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
37b90 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
37ba0 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
37bb0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
37bc0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
37bd0 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
37be0 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
37bf0 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
37c00 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
37c10 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
37c20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37c30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
37c40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
37c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37c60 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
37c70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
37c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
37c90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37ca0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37cb0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
37cc0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
37cd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
37ce0 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
37cf0 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
37d00 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
37d10 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
37d20 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
37d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
37d40 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
37d50 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
37d60 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
37d70 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
37d80 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
37d90 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
37da0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
37db0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
37dc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
37dd0 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
37de0 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
37df0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
37e00 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
37e10 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37e30 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
37e40 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37e50 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
37e60 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
37e70 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
37e80 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
37e90 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
37ea0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
37eb0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
37ec0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
37ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
37ee0 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
37ef0 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
37f00 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
37f10 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
37f20 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
37f30 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
37f40 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
37f50 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
37f60 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
37f70 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
37f80 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
37f90 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
37fa0 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
37fb0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
37fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
37fd0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
37fe0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
37ff0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
38000 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
38010 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
38020 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
38030 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
38040 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
38050 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
38060 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
38070 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
38080 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
38090 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
380a0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
380b0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
380c0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
380d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
380e0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
380f0 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
38100 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
38110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
38120 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
38130 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
38140 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
38150 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
38160 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
38170 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
38180 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e  might be held on
38190 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
381a0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
381b0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
381c0 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
381d0 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
381e0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
381f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
38200 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
38210 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
38220 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
38230 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
38240 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
38250 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
38260 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
38270 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
38280 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
38290 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
382a0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
382b0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
382c0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
382d0 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
382e0 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
382f0 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
38300 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
38310 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
38320 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
38330 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
38340 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
38350 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
38360 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
38370 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
38380 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
38390 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
383a0 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
383b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
383c0 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
383d0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
383e0 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
383f0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
38400 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
38410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
38420 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
38430 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
38440 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
38450 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
38460 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
38470 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
38480 5d 29 20 29 3b 0a 20 20 20 20 7d