/ Hex Artifact Content
Login

Artifact 656173030bd10759fe2d2eb053e115f5b0905a6088b9c27e35c7daee750a685a:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  , b) 0.#endif../
0f60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0f70: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
0f80: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 29  E_CORRUPT_PAGE()
0f90: 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 61 20   macro. Takes a 
0fa0: 73 69 6e 67 6c 65 0a 2a 2a 20 28 4d 65 6d 50 61  single.** (MemPa
0fb0: 67 65 2a 29 20 61 73 20 61 6e 20 61 72 67 75 6d  ge*) as an argum
0fc0: 65 6e 74 2e 20 54 68 65 20 28 4d 65 6d 50 61 67  ent. The (MemPag
0fd0: 65 2a 29 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  e*) must not be 
0fe0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  NULL..**.** If S
0ff0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 6e  QLITE_DEBUG is n
1000: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
1010: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 65   this macro is e
1020: 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20  quivalent to.** 
1030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1040: 4b 50 54 2e 20 4f 72 2c 20 69 66 20 53 51 4c 49  KPT. Or, if SQLI
1050: 54 45 5f 44 45 42 55 47 20 69 73 20 73 65 74 2c  TE_DEBUG is set,
1060: 20 74 68 65 6e 20 74 68 65 20 6c 6f 67 20 6d 65   then the log me
1070: 73 73 61 67 65 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  ssage.** normall
1080: 79 20 70 72 6f 64 75 63 65 64 20 61 73 20 61 20  y produced as a 
1090: 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 53  side-effect of S
10a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10b0: 50 54 20 69 73 20 61 75 67 6d 65 6e 74 65 64 0a  PT is augmented.
10c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
10d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 66 69 6c 65   number and file
10e0: 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
10f0: 77 69 74 68 20 74 68 65 20 28 4d 65 6d 50 61 67  with the (MemPag
1100: 65 2a 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e*)..*/.#ifdef S
1110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1120: 63 6f 72 72 75 70 74 50 61 67 65 45 72 72 6f 72  corruptPageError
1130: 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 4d 65 6d  (int lineno, Mem
1140: 50 61 67 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  Page *p){.  char
1150: 20 2a 7a 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65   *zMsg;.  sqlite
1160: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1170: 6f 63 28 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  oc();.  zMsg = s
1180: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1190: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a0: 69 6f 6e 20 70 61 67 65 20 25 64 20 6f 66 20 25  ion page %d of %
11b0: 73 22 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  s",.      (int)p
11c0: 2d 3e 70 67 6e 6f 2c 20 73 71 6c 69 74 65 33 50  ->pgno, sqlite3P
11d0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
11e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 0a  pBt->pPager, 0).
11f0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e    );.  sqlite3En
1200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1210: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
1220: 20 20 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74     sqlite3Report
1230: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1240: 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d  RUPT, lineno, zM
1250: 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
1260: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 23  ORRUPT_BKPT;.}.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43   define SQLITE_C
12a0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d 65 6d  ORRUPT_PAGE(pMem
12b0: 50 61 67 65 29 20 63 6f 72 72 75 70 74 50 61 67  Page) corruptPag
12c0: 65 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 2c  eError(__LINE__,
12d0: 20 70 4d 65 6d 50 61 67 65 29 0a 23 65 6c 73 65   pMemPage).#else
12e0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12f0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d  _CORRUPT_PAGE(pM
1300: 65 6d 50 61 67 65 29 20 53 51 4c 49 54 45 5f 43  emPage) SQLITE_C
1310: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 4d 65 6d  ORRUPT_PGNO(pMem
1320: 50 61 67 65 2d 3e 70 67 6e 6f 29 0a 23 65 6e 64  Page->pgno).#end
1330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c  ACHE..#ifdef SQL
1360: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1380: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1390: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
13a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  t() statement. *
13b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  **.**.** Check t
13c0: 6f 20 73 65 65 20 69 66 20 70 42 74 72 65 65 20  o see if pBtree 
13d0: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
13e0: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
13f0: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
1400: 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74 68 20   .** table with 
1410: 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e  root page iRoot.
1420: 20 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69     Return 1 if i
1430: 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
1440: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  not..**.** For e
1450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
1460: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1470: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1480: 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72  Root via .** Btr
1490: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42  ee connection pB
14a0: 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  tree:.**.**    a
14b0: 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
14c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14d0: 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c  Btree, iRoot, 0,
14e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a   WRITE_LOCK) );.
14f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69  **.** When writi
1500: 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 74  ng to an index t
1510: 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 61  hat resides in a
1520: 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 61   sharable databa
1530: 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  se, the .** call
1540: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  er should have f
1550: 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20  irst obtained a 
1560: 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20  lock specifying 
1570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1580: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
1590: 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54 68 69  nding table. Thi
15a0: 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 61  s makes things a
15b0: 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   bit more compli
15c0: 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74 68 69  cated,.** as thi
15d0: 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74 73 20  s module treats 
15e0: 65 61 63 68 20 74 61 62 6c 65 20 61 73 20 61 20  each table as a 
15f0: 73 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75  separate structu
1600: 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69 6e 65  re. To determine
1610: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f  .** the table co
1620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 77  he index being w
1640: 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a 2a 20  ritten, this.** 
1650: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
1660: 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74  search through t
1670: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1680: 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ma..**.** Instea
1690: 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  d of a lock on t
16a0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 72  he table/index r
16b0: 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52  ooted at page iR
16c0: 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  oot, the caller 
16d0: 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72  may.** hold a wr
16e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f  schema table (ro
1700: 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73  ot page 1). This
1710: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65   is also.** acce
1720: 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ptable..*/.stati
1730: 63 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43  c int hasSharedC
1740: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20  acheTableLock(. 
1750: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
1760: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1770: 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64  e that must hold
1780: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20   lock */.  Pgno 
1790: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
17a0: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b0: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  f b-tree */.  in
17c0: 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20  t isIndex,      
17d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17e0: 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  iRoot is the roo
17f0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d  t of an index b-
1800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  tree */.  int eL
1810: 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20  ockType         
1820: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63   /* Required loc
1830: 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43  k type (READ_LOC
1840: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1850: 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20   */.){.  Schema 
1860: 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65  *pSchema = (Sche
1870: 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74  ma *)pBtree->pBt
1880: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e  ->pSchema;.  Pgn
1890: 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74  o iTab = 0;.  Bt
18a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  Lock *pLock;..  
18b0: 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
18c0: 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61 72 65  ase is not share
18d0: 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68 65 20  able, or if the 
18e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
18f0: 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73 20 74  g.  ** and has t
1900: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1910: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1920: 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65  en no lock is re
1930: 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20 52 65  quired. .  ** Re
1940: 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65 64 69  turn true immedi
1950: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
1960: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1970: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1980: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1990: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
19a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
19c0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
19d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
19e0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
19f0: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1a00: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1a10: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
1a20: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
1a30: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
1a40: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
1a50: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
1a60: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
1a70: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1a80: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1a90: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1aa0: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1ab0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1ac0: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1ad0: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1ae0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1af0: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1b00: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1b10: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
1b20: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1b30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b40: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b50: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
1b60: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
1b70: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1b80: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1b90: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1ba0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1bb0: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1bc0: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1bd0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1be0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1bf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1c00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1c10: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1c20: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1c30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1c40: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
1c50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
1c60: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
1c70: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1c80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1c90: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1ca0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1cb0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1cd0: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1cf0: 20 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   iTab ){.       
1d00: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
1d10: 65 20 69 6e 64 65 78 65 73 20 73 68 61 72 65 20  e indexes share 
1d20: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d30: 67 65 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a  ge.  There must.
1d40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1d50: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d60: 20 20 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e    So just return
1d70: 20 74 72 75 65 2e 20 20 54 68 65 20 61 73 73 65   true.  The asse
1d80: 72 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  rt is not.      
1d90: 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
1da0: 20 74 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20   that case. */. 
1db0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1dd0: 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78       iTab = pIdx
1de0: 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a  ->pTable->tnum;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20  }else{.    iTab 
1e10: 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20  = iRoot;.  }..  
1e20: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
1e30: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1e40: 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d   Either a write-
1e50: 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67  lock on root-pag
1e60: 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20  e iTab, a .  ** 
1e70: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1e80: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  e schema table, 
1e90: 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e  or (if the clien
1ea0: 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a  t is reading) a.
1eb0: 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f    ** read-lock o
1ec0: 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66  n iTab will suff
1ed0: 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66  ice. Return 1 if
1ee0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72   any of these ar
1ef0: 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66  e found.  */.  f
1f00: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d  or(pLock=pBtree-
1f10: 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  >pBt->pLock; pLo
1f20: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
1f30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1f40: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1f50: 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20  pBtree .     && 
1f60: 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d  (pLock->iTable==
1f70: 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e  iTab || (pLock->
1f80: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f90: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  K && pLock->iTab
1fa0: 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20  le==1)).     && 
1fb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  pLock->eLock>=eL
1fc0: 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a  ockType .    ){.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff0: 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74  Failed to find t
2000: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
2010: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
2020: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2030: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
2040: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2050: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
2060: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
2070: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
2080: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2090: 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a  ts only. ****.**
20a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20b0: 69 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  if it would be i
20c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65  llegal for pBtre
20d0: 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
20e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20f0: 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20  index rooted at 
2100: 69 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74  iRoot because ot
2110: 68 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  her shared conne
2120: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69  ctions are.** si
2130: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61  multaneously rea
2140: 64 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74  ding that same t
2150: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
2160: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2170: 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f  al for pBtree to
2180: 20 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f   write if some o
2190: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
21a0: 74 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73  t that.** shares
21b0: 20 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72   the same BtShar
21c0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72  ed object is cur
21d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
21e0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  r writing.** the
21f0: 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45   iRoot table.  E
2200: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74  xcept, if the ot
2210: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
2220: 20 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64   has the.** read
2230: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2240: 67 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  g set, then it i
2250: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68  s OK for the oth
2260: 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  er object to.** 
2270: 68 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73  have a read curs
2280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  or..**.** For ex
2290: 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72  ample, before wr
22a0: 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72  iting to any par
22b0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  t of the table o
22c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65  r index.** roote
22d0: 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c  d at page iRoot,
22e0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c   one should call
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
2300: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
2310: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
2320: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
2330: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
2340: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
2350: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
2360: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2370: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
2380: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
2390: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
23a0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
23b0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
23c0: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
23d0: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
23e0: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
23f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2400: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a 20 20 20  eadUncommit).   
2410: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2420: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
2440: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
2450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2460: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
2470: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
2480: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
2490: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24a0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
24b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
24c0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
24d0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
24e0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
24f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2500: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
2510: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
2520: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
2530: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
2540: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
2550: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
2560: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
2570: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2580: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2590: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
25a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
25b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
25c0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
25d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25e0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
25f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2600: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2610: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2620: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2630: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
2640: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
2650: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2660: 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c 6f  adUncommit)||eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
2680: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
2690: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
26a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
26b0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
26c0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
26d0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
26e0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
26f0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
2700: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
2710: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
2720: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
2730: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
2740: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
2750: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2760: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2770: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
2780: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
2790: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27a0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
27b0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
27c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
27d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27e0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
27f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2800: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
2810: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
2820: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
2830: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2840: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2860: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
2870: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2880: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
2890: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
28a0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
28b0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
28c0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
28d0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
28e0: 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d  iter!=p && (pBt-
28f0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2900: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b  EXCLUSIVE)!=0 ){
2910: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
2920: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
2930: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
2940: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
2950: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2960: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2970: 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  }..  for(pIter=p
2980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
2990: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
29a0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Next){.    /* Th
29b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74  e condition (pIt
29c0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
29d0: 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ) in the followi
29e0: 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20  ng if(...) .    
29f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ** statement is 
2a00: 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  a simplification
2a10: 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2a20: 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49  **   (eLock==WRI
2a30: 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  TE_LOCK || pIter
2a40: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
2a50: 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  OCK).    **.    
2a60: 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2a70: 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d   that if eLock==
2a80: 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e  WRITE_LOCK, then
2a90: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2aa0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20  tion.    ** may 
2ab0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2ac0: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2ad0: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2ae0: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2af0: 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69   ** only be a si
2b00: 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20  ngle writer)..  
2b10: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b20: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
2b30: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
2b40: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2b50: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
2b60: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b70: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70  LOCK || pIter->p
2b80: 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65  Btree==p || pIte
2b90: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2ba0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49  OCK);.    if( pI
2bb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
2bc0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
2bd0: 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e  =iTab && pIter->
2be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a  eLock!=eLock ){.
2bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2c00: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2c10: 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74  ->db, pIter->pBt
2c20: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
2c30: 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  if( eLock==WRITE
2c40: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
2c50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
2c60: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
2c70: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
2c80: 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47  s |= BTS_PENDING
2c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cb0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
2cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2d20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2d30: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
2d40: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2d50: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
2d60: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
2d70: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
2d80: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
2d90: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
2da0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
2db0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
2dc0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
2dd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2de0: 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sumes the follow
2df0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29  ing:.**.**   (a)
2e00: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42   The specified B
2e10: 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73  tree object p is
2e20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
2e30: 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20  sharable.**     
2e40: 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20    database (one 
2e50: 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65  with the BtShare
2e60: 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20  d.sharable flag 
2e70: 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  set), and.**.** 
2e80: 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42    (b) No other B
2e90: 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c  tree objects hol
2ea0: 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f  d a lock that co
2eb0: 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20  nflicts.**      
2ec0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2ed0: 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71  ted lock (i.e. q
2ee0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2ef0: 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a  ableLock() has.*
2f00: 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  *       already 
2f10: 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20  been called and 
2f20: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
2f30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OK)..**.** SQLIT
2f40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f50: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
2f60: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
2f70: 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ly. SQLITE_NOMEM
2f80: 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64   .** is returned
2f90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74   if a malloc att
2fa0: 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  empt fails..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
2fc0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2fd0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2fe0: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
2ff0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
3000: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
3010: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3020: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
3030: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
3040: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3050: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
3060: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
3070: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
3080: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
3090: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
30a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e  0 );..  /* A con
30b0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  nection with the
30c0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
30d0: 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20  d flag set will 
30e0: 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a  never try to.  *
30f0: 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d  * obtain a read-
3100: 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20  lock using this 
3110: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e  function. The on
3120: 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74  ly read-lock obt
3130: 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  ained.  ** by a 
3140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65  connection in re
3150: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d  ad-uncommitted m
3160: 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71  ode is on the sq
3170: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a  lite_master .  *
3180: 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61  * table, and tha
3190: 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  t lock is obtain
31a0: 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e  ed in BtreeBegin
31b0: 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61  Trans().  */.  a
31c0: 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62  ssert( 0==(p->db
31d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
31e0: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c 20  eadUncommit) || 
31f0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3200: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
3210: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3220: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
3230: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
3240: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
3250: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
3260: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
3270: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
3280: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
3290: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
32a0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
32b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
32c0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
32d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
32e0: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
32f0: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
3300: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
3310: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
3320: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
3330: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3340: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
3350: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
3360: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
3370: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
3380: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
3390: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
33a0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
33b0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
33c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
33d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
33e0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
33f0: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
3400: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
3410: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
3420: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
3430: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
3440: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
3450: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
3460: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
3470: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
3480: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
3490: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
34a0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
34b0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
34c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34d0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
34e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
34f0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
3500: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
3510: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
3520: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
3530: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
3540: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
3550: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
3560: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
3570: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
3580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3590: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
35a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
35b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
35d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
35e0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
35f0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
3600: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
3610: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
3620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
3630: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
3640: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
3650: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
3660: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
3670: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
3680: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
3690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36a0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
36b0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
36c0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
36e0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
36f0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
3700: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
3710: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
3720: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
3730: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
3740: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
3750: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
3760: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3780: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
3790: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
37a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
37b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37c0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
37d0: 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44  hen the BTS_PEND
37e0: 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20  ING flag.** may 
37f0: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
3800: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
3810: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
3820: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3830: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3840: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3850: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
3860: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
3870: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
3880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3890: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
38a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
38b0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
38c0: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
38d0: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
38e0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
38f0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
3900: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
3910: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
3920: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
3930: 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45   & BTS_EXCLUSIVE
3940: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3950: 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  iter==pLock->pBt
3960: 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ree );.    asser
3970: 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  t( pLock->pBtree
3980: 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b  ->inTrans>=pLock
3990: 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ->eLock );.    i
39a0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
39b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
39c0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
39d0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
39e0: 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  t( pLock->iTable
39f0: 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70  !=1 || pLock==&p
3a00: 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  ->lock );.      
3a10: 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  if( pLock->iTabl
3a20: 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=1 ){.        
3a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
3a40: 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
3a60: 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70  Iter = &pLock->p
3a70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
3a80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
3a90: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3aa0: 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70  PENDING)==0 || p
3ab0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
3ac0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3ad0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  r==p ){.    pBt-
3ae0: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3af0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3b00: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3b10: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3b20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74  .  }else if( pBt
3b30: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
3b40: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  2 ){.    /* This
3b50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3b60: 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70  led when Btree p
3b70: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
3b80: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
3b90: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
3bb0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
3bc0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
3bd0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
3be0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3bf0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
3c00: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
3c10: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
3c20: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
3c30: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
3c40: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
3c50: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
3c60: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3c70: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
3c80: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
3c90: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3ca0: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
3cb0: 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74  BTS_PENDING must
3cc0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
3cd0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
3ce0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
3cf0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
3d00: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3d10: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3d20: 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20   ~BTS_PENDING;. 
3d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3d40: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
3d50: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
3d60: 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  s held by Btree 
3d70: 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b  p into read-lock
3d80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3d90: 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  d downgradeAllSh
3da0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3db0: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
3dc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
3dd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
3de0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3df0: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3e00: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57  ock;.    pBt->pW
3e10: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3e20: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3e30: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
3e40: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
3e50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d    for(pLock=pBt-
3e60: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
3e70: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
3e80: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3e90: 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d  ( pLock->eLock==
3ea0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  READ_LOCK || pLo
3eb0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b  ck->pBtree==p );
3ec0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  .      pLock->eL
3ed0: 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
3ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3ef0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3f00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3f10: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3f20: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
3f30: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
3f40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64        /* Forward
3f50: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3f60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3f70: 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
3f80: 20 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f   *pPage);      /
3f90: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3fa0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
3fb0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
3fc0: 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
3fd0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3fe0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3ff0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
4000: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
4010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
4020: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
4030: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4040: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
4050: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
4060: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
4070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4080: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
4090: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
40a0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
40b0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
40c0: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
40d0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69  tex);.}../* Veri
40e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
40f0: 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61  or and the BtSha
4100: 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20  red agree about 
4110: 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72  what is the curr
4120: 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
4130: 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20  connetion. This 
4140: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
4150: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
4160: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
4170: 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  se .** connectio
4180: 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f  n pointers get o
4190: 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69  ut-of-sync, it i
41a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  s possible for r
41b0: 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20  outines like.** 
41c0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
41d0: 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20  to reference an 
41e0: 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  stale connection
41f0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65   pointer that re
4200: 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20  ferences a.** a 
4210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
4220: 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73  has already clos
4230: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
4240: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
4250: 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
4260: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64  tements only and
4270: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
4280: 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   of double-check
4290: 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72  ing that the btr
42a0: 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20  ee code.** does 
42b0: 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73  keep the databas
42c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
42d0: 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65  nters up-to-date
42e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42f0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
4300: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ed(BtCursor *p){
4310: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4320: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  rHoldsMutex(p) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
4340: 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42  Btree->db==p->pB
4350: 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  t->db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
4370: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
4380: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
4390: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
43a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
43b0: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
43c0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
43d0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
43e0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
43f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4400: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
4410: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
4420: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
4430: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
4440: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
4450: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
4460: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
4470: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
4480: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
44b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
44c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
44d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
44e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
44f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4500: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
4510: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
4520: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
4530: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4540: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
4550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4560: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
4570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4580: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
4590: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
45a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
45b0: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
45c0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
45d0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
45e0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
45f0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
4600: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
4610: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
4620: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
4630: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
4640: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
4650: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
4660: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
4670: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
4680: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4690: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
46a0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
46b0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
46c0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
46d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
46e0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
46f0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
4700: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
4710: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
4720: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
4730: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
4740: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
4750: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
4760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4770: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
4780: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
4790: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
47a0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
47b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
47c0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
47d0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
47e0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
47f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4800: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
4810: 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
4820: 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
4830: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4840: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
4850: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69  nging */.  i64 i
4860: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
4870: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
4880: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
4890: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
48a0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
48b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
48c0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
48d0: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
48e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
48f0: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4900: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4910: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4920: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4930: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4940: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
4950: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
4960: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
4970: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
4980: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
4990: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
49a0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
49b0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
49c0: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
49d0: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
49e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
49f0: 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26  Root==pgnoRoot &
4a00: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
4a10: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
4a20: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
4a30: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4a40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4a60: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4a70: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4a80: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4a90: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4aa0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4ab0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
4ac0: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4ae0: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4af0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4b00: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4b10: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4b20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4b30: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4b40: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4b50: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
4b60: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
4b70: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
4b80: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
4b90: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4ba0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
4bb0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4bc0: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4bd0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4be0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4bf0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4c00: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4c10: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4c20: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4c30: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4c40: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4c50: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
4c60: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
4c70: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
4c80: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c90: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
4ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
4cb0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4cc0: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4cd0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4ce0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4cf0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4d00: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4d10: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4d20: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4d30: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4d40: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4d50: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
4d60: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
4d70: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
4d80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4d90: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
4da0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
4db0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4dc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4dd0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4de0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4df0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4e00: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4e10: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4e20: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4e30: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4e40: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4e50: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4e60: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4e70: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4e80: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4e90: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4ea0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4eb0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4ec0: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4ed0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4ee0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4ef0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4f00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4f10: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4f20: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4f30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4f40: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4f50: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4f60: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4f70: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4f80: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4f90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4fa0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4fb0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4fc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4fd0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4fe0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4ff0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
5000: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
5010: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
5020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5030: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
5040: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
5050: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
5060: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
5070: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5080: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
5090: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
50a0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
50b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
50c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
50d0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
50e0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
50f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
5100: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
5110: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
5120: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
5130: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
5140: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
5150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
5160: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
5170: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
5180: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
5190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
51a0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
51b0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
51c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
51d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
51e0: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
51f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5200: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
5210: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5230: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
5240: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
5250: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
5260: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
5270: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
5280: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
5290: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
52a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
52b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
52c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
52d0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
52e0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
52f0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
5300: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5310: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
5320: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
5330: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
5340: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5350: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
5360: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5370: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
5380: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5390: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
53a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
53c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
53d0: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
53e0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
53f0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
5400: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
5410: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
5420: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
5430: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
5440: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
5450: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
5460: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
5470: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
5490: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
54a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
54b0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
54c0: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
54d0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
54e0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
54f0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5500: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5510: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5530: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5540: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5550: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5560: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
5570: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
5580: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
5590: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
55a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
55b0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
55c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
55d0: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
55e0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
55f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5600: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5610: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5620: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5630: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5640: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5660: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
5670: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75  int i;.  if( pCu
56a0: 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
56c0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
56d0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
56e0: 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
56f0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5700: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
5710: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
5720: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
5730: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d  >iPage = -1;.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
5750: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5760: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5770: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5780: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
57b0: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
57c0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
57d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
57e0: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
57f0: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5800: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
5810: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
5820: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
5830: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5840: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
5850: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
5860: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5870: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5880: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5890: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
58a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
58b0: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
58c0: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
58d0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
58e0: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
58f0: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5900: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
5910: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5920: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
5930: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
5940: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
5950: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
5960: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5970: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5980: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5990: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
59b0: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
59c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
59d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
59e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
59f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5a00: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5a10: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5a30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5a40: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5a50: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5a70: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5a80: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5a90: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5aa0: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5ab0: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5ac0: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5ad0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5ae0: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5af0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5b00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
5b10: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
5b20: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5b30: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5b40: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
5b50: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
5b60: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5b70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5b80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5b90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5ba0: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5bb0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5bc0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5bd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5be0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5bf0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5c40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
5c50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
5c60: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5c70: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5c80: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5c90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ca0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5cb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5cc0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5cd0: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5ce0: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5cf0: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5d00: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
5d10: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
5d20: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
5d30: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
5d40: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
5d50: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
5d60: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5d70: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5d80: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5d90: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5db0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5dc0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5dd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5de0: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5df0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5e00: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5e10: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5e30: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5e40: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5e50: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5e60: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5e80: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5e90: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5ea0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5eb0: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5ec0: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5ed0: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5ee0: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f00: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
5f10: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
5f20: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
5f30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5f40: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5f50: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
5f60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5f70: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5f80: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5f90: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5fa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5fd0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5fe0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5ff0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
6000: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
6010: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
6020: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
6030: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
6040: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
6050: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
6060: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6070: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
6080: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
6090: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
60a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
60b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
60c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
60d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
60e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
60f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
6100: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
6110: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
6120: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
6130: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
6140: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
6150: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
6160: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
6170: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
6180: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
6190: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
61a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
61b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
61c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
61d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
61e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
61f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
6200: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
6210: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
6220: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
6230: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
6240: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
6250: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
6260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
6270: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
6280: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
6290: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
62a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
62b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
62c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
62d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
62e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
62f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
6300: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
6310: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
6320: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
6330: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
6340: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
6350: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
6360: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
6370: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
6380: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
6390: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
63a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
63b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
63c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
63d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
63e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
63f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
6400: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
6410: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
6420: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
6430: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
6440: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
6450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
6460: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
6470: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
6480: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
6490: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
64a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
64b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
64c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
64d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
64e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
64f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
6500: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
6510: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
6520: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6530: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6540: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6550: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6560: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6570: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6580: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6590: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
65a0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
65b0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
65c0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
65d0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
65e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
65f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6600: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
6610: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
6620: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
6630: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
6640: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
6650: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
6660: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6670: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6680: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6690: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
66a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
66b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
66c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
66d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
66e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
66f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6700: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
6710: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
6720: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
6730: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
6740: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
6750: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
6760: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6770: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6780: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6790: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
67a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
67b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
67c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
67d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
67e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
67f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6800: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
6810: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
6820: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6830: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6840: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6850: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
6860: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6870: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6880: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6890: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
68a0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
68b0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
68c0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
68d0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
68e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
68f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
6910: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
6920: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62  >=0 );.        b
6930: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
6940: 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
6950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6960: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
6970: 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72  }while( p );.  r
6980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
69a0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
69b0: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
69c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
69d0: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
69e0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
69f0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a00: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6a20: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6a30: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6a40: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6a50: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
6a70: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
6a80: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
6a90: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
6aa0: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
6ab0: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
6ac0: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
6ad0: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
6ae0: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
6af0: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
6b00: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
6b10: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
6b20: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
6b30: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
6b40: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
6b50: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
6b60: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
6b70: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
6b80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
6b90: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
6ba0: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
6bb0: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
6bc0: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
6bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
6be0: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
6bf0: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
6c00: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
6c10: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
6c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
6c30: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
6c40: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
6c50: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
6c60: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
6c70: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
6c80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
6cb0: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
6cc0: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
6cd0: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
6ce0: 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28  ex key */..  if(
6cf0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6d00: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6d10: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6d20: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6d30: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6d40: 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e  kedRecord(pCur->
6d50: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6d60: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6d80: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6d90: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6da0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6db0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6dc0: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6dd0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
6de0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
6df0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6e10: 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
6e20: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _done;.    }.  }
6e30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
6e40: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
6e50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
6e60: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
6e70: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
6e80: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d  , bias, pRes);.m
6e90: 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66  oveto_done:.  if
6ea0: 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6ec0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6ed0: 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  b, pIdxKey);.  }
6ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ef0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6f00: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6f10: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6f20: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6f30: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6f40: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6f50: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6f60: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
6f70: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
6f80: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
6f90: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
6fa0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
6fb0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6fc0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6fd0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6fe0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6ff0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
7000: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
7010: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
7020: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
7030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
7040: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7050: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
7060: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
7070: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
7080: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
7090: 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
70a0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
70b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
70c0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
70d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
70e0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
70f0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
7100: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
7110: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
7120: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7130: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
7140: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
7150: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7160: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
7170: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
7180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71a0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
71b0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
71c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
71d0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
71e0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
71f0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7200: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
7210: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
7220: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
7230: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
7240: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
7250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7260: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
7270: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7280: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
7290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
72a0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
72b0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
72c0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
72d0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
72e0: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
72f0: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
7300: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7310: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
7320: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
7330: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
7340: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
7350: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
7360: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
7370: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
7380: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
7390: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
73a0: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
73b0: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
73c0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
73d0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
73e0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
73f0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
7400: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
7410: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
7420: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
7430: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
7440: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
7450: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
7460: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7470: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
7480: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
7490: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
74a0: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
74b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
74c0: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
74d0: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
74e0: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
74f0: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
7500: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
7530: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7540: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
7550: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
7560: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
7570: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
75a0: 61 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  ake BtCursor obj
75b0: 65 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c  ect that will al
75c0: 77 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66  ways answer.** f
75d0: 61 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69  alse to the sqli
75e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
75f0: 73 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65  sMoved() routine
7600: 20 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b   above.  The fak
7610: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75  e.** cursor retu
7620: 72 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65  rned must not be
7630: 20 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f   used with any o
7640: 74 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72  ther Btree inter
7650: 66 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f  face..*/.BtCurso
7660: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  r *sqlite3BtreeF
7670: 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76  akeValidCursor(v
7680: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75  oid){.  static u
7690: 38 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43  8 fakeCursor = C
76a0: 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61  URSOR_VALID;.  a
76b0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
76c0: 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65  BtCursor, eState
76d0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
76e0: 20 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b   (BtCursor*)&fak
76f0: 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eCursor;.}../*.*
7700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7710: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7720: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7730: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7740: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
7750: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
7760: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7770: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7780: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7790: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
77a0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
77b0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
77c0: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
77d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
77e0: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
77f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7800: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7810: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7820: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7830: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7840: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
7850: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
7860: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7870: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7880: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7890: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
78a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
78b0: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
78c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
78d0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
78e0: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
78f0: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7900: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7910: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7920: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7940: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
7950: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
7960: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7970: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7980: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7990: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
79a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
79b0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
79c0: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
79d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
79e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
79f0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7a00: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7a10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7a20: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7a30: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7a40: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
7a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7a70: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7a80: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7a90: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ab0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ac0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7ad0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7ae0: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7af0: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7b00: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7b10: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7b20: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7b30: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7b40: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
7b50: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
7b60: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7b70: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7b80: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7b90: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7ba0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7bb0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7bd0: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7be0: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7bf0: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7c00: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7c10: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7c20: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7c30: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7c40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
7c50: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
7c60: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7c80: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7c90: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7ca0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7cb0: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7cc0: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7cd0: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7ce0: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7cf0: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7d00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7d20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7d30: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7d40: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
7d50: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
7d60: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7d70: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7d80: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7d90: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7da0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7db0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7dd0: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7de0: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7df0: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7e00: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7e20: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7e30: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7e40: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
7e50: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
7e60: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7e70: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7e80: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7e90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7ea0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7eb0: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7ec0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7ed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7ee0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7ef0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f00: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7f10: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7f20: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7f30: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7f40: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
7f50: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
7f60: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7f70: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7f80: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7f90: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7fa0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7fb0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7fc0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7fd0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7fe0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7ff0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
8000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8010: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
8020: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
8030: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
8040: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
8050: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
8060: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
8070: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
8080: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
8090: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
80a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
80b0: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
80c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
80d0: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
80e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
80f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8100: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
8110: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
8120: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
8130: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
8140: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
8150: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
8160: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
8170: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
8180: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
8190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
81a0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
81b0: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
81c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
81d0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
81e0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
81f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
8210: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8220: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
8230: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8240: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8250: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8260: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
8270: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
8280: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
8290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
82b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
82c0: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
82d0: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
82e0: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
82f0: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
8300: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
8310: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
8320: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
8330: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8340: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
8350: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
8360: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
8370: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8390: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
83a0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
83b0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
83c0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
83d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
83e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
83f0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8400: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
8410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8420: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
8430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
8440: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
8450: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
8460: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
8470: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
8480: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
8490: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
84a0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
84b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
84c0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
84d0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
84e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
84f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8500: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8510: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
8520: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
8530: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
8540: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
8550: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
8560: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
8570: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8580: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8590: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
85a0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
85b0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
85c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
85d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
85e0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
85f0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
8600: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
8610: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
8620: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
8630: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
8640: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
8650: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
8660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8670: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8680: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
86a0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
86b0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
86c0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
86d0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
86e0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
86f0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8700: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8710: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8720: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8730: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8740: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8750: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
8760: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8770: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8780: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8790: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
87a0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
87b0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
87c0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
87d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
87e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8810: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8820: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8830: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8840: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8850: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8860: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8870: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8880: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8890: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
88a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
88b0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
88c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
88d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
88e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
88f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8900: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8910: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8920: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8930: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8940: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8950: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8960: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8970: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8980: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8990: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
89a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
89b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
89c0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
89e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
89f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8a00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8a10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8a20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8a30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8a50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8a60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8a70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8a80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8a90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8aa0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8ab0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8ac0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8ad0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74  CORRUPT_PGNO(iPt
8ae0: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
8af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
8b00: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
8b10: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
8b20: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
8b30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
8b40: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
8b50: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8b60: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8b70: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8b80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8b90: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8ba0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8bb0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8bc0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8bd0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8be0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8bf0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8c00: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8c10: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8c20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8c30: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8c40: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8c50: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8c60: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8c70: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8c80: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8c90: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8ca0: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8cb0: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8cc0: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8cd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8ce0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8cf0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8d00: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8d10: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8d20: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
8d30: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
8d40: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8d50: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8d60: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8d70: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8d80: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8d90: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8da0: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8db0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8dc0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8dd0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8de0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8df0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
8e00: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
8e10: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
8e20: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
8e30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8e40: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
8e50: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8e60: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8e70: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8e80: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8e90: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8ea0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8eb0: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8ec0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8ed0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8ee0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8ef0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
8f00: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
8f10: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
8f20: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8f30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8f40: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8f50: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8f60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8f70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8f80: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f90: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8fa0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8fb0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8fd0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8fe0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8ff0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9000: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9010: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9020: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9030: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9040: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9060: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9070: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9080: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9090: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
90a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
90b0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
90c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
90d0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
90e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
90f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9100: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9110: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9120: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9130: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9140: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9150: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9160: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9170: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9180: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9190: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
91a0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
91b0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
91c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
91d0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
91e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
91f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9200: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9210: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9220: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9230: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9240: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9250: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9260: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9270: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9280: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9290: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
92a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
92b0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
92c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
92e0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
92f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9300: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9310: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9320: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9330: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9340: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9350: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9360: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9370: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9380: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9390: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
93a0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
93b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
93c0: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
93d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
93e0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
93f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9400: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
9410: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
9420: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9430: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9440: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9450: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9460: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9470: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9480: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9490: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
94a0: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
94b0: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
94c0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
94d0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
94e0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
94f0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9500: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
9510: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
9520: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9530: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9540: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9550: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9560: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9570: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9580: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9590: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
95a0: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
95b0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
95c0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
95d0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
95e0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
95f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9600: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9610: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9620: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9640: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9650: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9660: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9670: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9690: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
96b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
96c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
96d0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
96e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9700: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9710: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9720: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9730: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9740: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9750: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9760: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9770: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9780: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
97b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
97c0: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
97d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
97e0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
97f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9800: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9810: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9820: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9840: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9850: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9890: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98b0: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
98c0: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
98d0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
98f0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9900: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9910: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9930: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9940: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9960: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9970: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9980: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9990: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
99a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
99b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
99c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
99d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99e0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
99f0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9a00: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9a10: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9a20: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9a30: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9a40: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9a50: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9a60: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9a70: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9a80: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9a90: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9aa0: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9ab0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9ac0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9ad0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9ae0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9af0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9b00: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9b10: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9b20: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9b30: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9b40: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9b50: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9b60: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9b70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9b80: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9b90: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9ba0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9bb0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9bc0: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9bd0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9be0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9bf0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9c00: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9c10: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9c20: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9c30: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9c40: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9c50: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9c60: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9c70: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9c80: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9c90: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9cb0: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9cc0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9cd0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9ce0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9cf0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d20: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
9d40: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
9d50: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9d60: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9d70: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9d80: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9d90: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9da0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9db0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9dc0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9dd0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9de0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9df0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9e00: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9e10: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9e20: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9e30: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9e40: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9e50: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9e60: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9e70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9e80: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9e90: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9ea0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9eb0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9ec0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9ed0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9ee0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ef0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9f00: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9f10: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9f20: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9f30: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9f40: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9f50: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9f60: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9f70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9f80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9f90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9fa0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9fb0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9fc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9fd0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9fe0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9ff0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a000: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a010: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a020: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a030: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a040: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a050: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a060: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a080: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a090: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a0b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a0c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a0d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a0e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a0f0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a100: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a110: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a120: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a130: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a140: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a150: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a160: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a170: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a180: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a190: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a1a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a1b0: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a1c0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a1d0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a1e0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a1f0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a200: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a210: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a230: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a240: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a250: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a260: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a270: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a2a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a2b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a2c0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a2d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a2e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a2f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a300: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a310: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a320: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a330: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a340: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a350: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a360: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a370: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a380: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a390: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a3a0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a3b0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a3c0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a3d0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a3f0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a400: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a410: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a420: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a430: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a440: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a450: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a460: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a470: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a480: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a4a0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a4b0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a4c0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a4d0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a4e0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a4f0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a500: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a510: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a520: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a530: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a550: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a560: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a570: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a580: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a590: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a5a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a5b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a5c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a5d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a5e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a5f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a600: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a610: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a620: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a630: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a640: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a650: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a660: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a670: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a680: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a690: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6a0: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a6b0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a6c0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a6e0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a6f0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a700: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a710: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a720: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a730: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a740: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a750: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a760: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a770: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a780: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a790: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a7c0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a7d0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a810: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a820: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a830: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a840: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a850: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a860: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a870: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a880: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a890: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a8a0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a8c0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a8d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a8e0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a8f0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a900: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a910: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a920: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a930: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a940: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a950: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a960: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a970: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a980: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a990: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a9a0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a9b0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a9c0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a9d0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a9e0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a9f0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
aa00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
aa10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
aa20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
aa30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
aa50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
aa60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
aa70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
aa80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
aa90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
aaa0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
aab0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
aac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
aad0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
aae0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
aaf0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
ab00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ab10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
ab20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ab30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ab40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ab50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ab60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ab70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ab80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ab90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
aba0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
abb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
abc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
abd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
abe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
abf0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
ac00: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
ac10: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
ac20: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
ac30: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
ac40: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
ac50: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
ac60: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
ac70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
ac80: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
ac90: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
aca0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
acb0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
acc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
acd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
ace0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
acf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
ad00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
ad10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
ad20: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
ad30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ad40: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
ad50: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
ad60: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
ad70: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
ad80: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
ad90: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
ada0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
adb0: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
adc0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
add0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
ade0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
adf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
ae00: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
ae10: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
ae20: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
ae30: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
ae40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
ae50: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
ae60: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
ae70: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ae80: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
ae90: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
aea0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
aeb0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
aec0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
aed0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
aee0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
aef0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
af00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
af10: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
af20: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
af30: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
af40: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
af50: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
af60: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
af70: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
af80: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
af90: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
afa0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
afb0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
afc0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
afd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
afe0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
aff0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b000: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b010: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b020: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b030: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b040: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b050: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b060: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b070: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b080: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b090: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b0a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b0b0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b0c0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b0d0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b0e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b0f0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b100: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b110: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b120: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b130: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b140: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b150: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b160: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b170: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b180: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b190: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
b1a0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
b1b0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
b1c0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
b1d0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
b1e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
b1f0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
b200: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
b210: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
b220: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
b240: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
b250: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
b260: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
b270: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
b280: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
b290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
b2a0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
b2b0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b2c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
b2d0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
b2e0: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
b2f0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
b300: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
b310: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
b320: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
b330: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
b340: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
b350: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
b360: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
b370: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
b390: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
b3a0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
b3b0: 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c  reorganizes cell
b3c0: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
b3d0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
b3e0: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62  re are no free-b
b3f0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65  locks on the fre
b400: 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a  e-block list..**
b410: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d  .** Parameter nM
b420: 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61  axFrag is the ma
b430: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
b440: 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  fragmented space
b450: 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
b460: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70  present in the p
b470: 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72  age after this r
b480: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
b490: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
b4a0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
b4b0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
b4c0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
b4d0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
b4e0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
b4f0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
b500: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
b510: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
b520: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
b530: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
b540: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
b550: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
b560: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
b570: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
b580: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
b590: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
b5a0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
b5b0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
b5c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61   *pPage, int nMa
b5d0: 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b  xFrag){.  int i;
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b600: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b630: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
b640: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b670: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
b680: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b6a0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
b6c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b6d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
b6e0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
b6f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
b700: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b720: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
b730: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
b740: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
b750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
b770: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
b780: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b7a0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
b7b0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
b7c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b7d0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
b7e0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
b7f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
b800: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
b810: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
b820: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
b830: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
b850: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
b860: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
b870: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b880: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
b890: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
b8a0: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b8c0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
b8d0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  l index */..  as
b8e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b8f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b900: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b910: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b920: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b950: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b960: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b970: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b980: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b9a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b9b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b9c0: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b9d0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b9e0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b9f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
ba00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
ba10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
ba20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
ba30: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
ba40: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
ba50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ba60: 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   );.  iCellFirst
ba70: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ba80: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c  2*nCell;.  usabl
ba90: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
baa0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bab0: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
bac0: 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77   handles pages w
bad0: 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72  ith two or fewer
bae0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64   free blocks and
baf0: 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f   nMaxFrag.  ** o
bb00: 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74  r fewer fragment
bb10: 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69  ed bytes. In thi
bb20: 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73  s case it is fas
bb30: 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a  ter to move the.
bb40: 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65    ** two (or one
bb50: 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c  ) blocks of cell
bb60: 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28  s using memmove(
bb70: 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65  ) and add the re
bb80: 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73  quired.  ** offs
bb90: 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e  ets to each poin
bba0: 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  ter in the cell-
bbb0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68  pointer array th
bbc0: 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a  an it is to .  *
bbd0: 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68  * reconstruct th
bbe0: 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20  e entire page.  
bbf0: 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61  */.  if( (int)da
bc00: 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46  ta[hdr+7]<=nMaxF
bc10: 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  rag ){.    int i
bc20: 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28  Free = get2byte(
bc30: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
bc40: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
bc50: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
bc60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bc70: 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20  a[iFree]);..    
bc80: 20 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f    /* pageFindSlo
bc90: 74 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  t() has already 
bca0: 76 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72  verified that fr
bcb0: 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f  ee blocks are so
bcc0: 72 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rted.      ** in
bcd0: 20 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74   order of offset
bce0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bcf0: 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c  , and that no bl
bd00: 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ock extends.    
bd10: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bd20: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50  d of the page. P
bd30: 72 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20  rovided the two 
bd40: 66 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f  free slots do no
bd50: 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  t .      ** over
bd60: 6c 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e  lap, this guaran
bd70: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65  tees that the me
bd80: 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65  mmove() calls be
bd90: 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
bda0: 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20     ** overwrite 
bdb0: 74 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62  the usableSize b
bdc0: 79 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e  yte buffer, even
bdd0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
bde0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
bdf0: 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
be00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
be10: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
be20: 3e 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  >iFree );.      
be30: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65  assert( iFree+ge
be40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
be50: 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  ee+2]) <= usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
be70: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
be80: 7c 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79  || iFree2+get2by
be90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bea0: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
beb0: 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
bec0: 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61  0==iFree2 || (da
bed0: 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26  ta[iFree2]==0 &&
bee0: 20 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d   data[iFree2+1]=
bef0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  =0) ){.        u
bf00: 38 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b  8 *pEnd = &data[
bf10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
bf20: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75  ll*2];.        u
bf30: 38 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20  8 *pAddr;.      
bf40: 20 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20    int sz2 = 0;. 
bf50: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
bf60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
bf70: 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20  Free+2]);.      
bf80: 20 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32    int top = get2
bf90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bfa0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
bfb0: 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20  top>=iFree ){.  
bfc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
bfe0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
bff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c000: 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20   iFree2 ){.     
c010: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c020: 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b  ee+sz<=iFree2 );
c030: 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79 20   /* Verified by 
c040: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a  pageFindSlot() *
c050: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  /.          sz2 
c060: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c070: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
c080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c090: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
c0a0: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
c0b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
c0c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
c0d0: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
c0e0: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
c0f0: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
c100: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
c110: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
c120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c130: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
c140: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c150: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
c160: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
c170: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
c180: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
c190: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
c1a0: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
c1b0: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
c1c0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
c1d0: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
c1e0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
c1f0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
c200: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
c210: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
c220: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
c230: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
c240: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
c250: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
c260: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
c270: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c280: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
c290: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
c2a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
c2b0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
c2c0: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
c2d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
c2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
c2f0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
c300: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
c310: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
c320: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
c330: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
c340: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
c350: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c360: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
c370: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
c380: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
c390: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
c3a0: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
c3b0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
c3c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c3d0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
c3e0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
c3f0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
c400: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
c410: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c420: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c430: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c460: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
c470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
c480: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
c490: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
c4a0: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
c4b0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
c4c0: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
c4d0: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
c4e0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
c4f0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
c500: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
c510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c530: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
c540: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c550: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
c560: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
c570: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
c580: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
c590: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c5b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
c5c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
c5d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
c5e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
c5f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
c600: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
c610: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
c620: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
c630: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
c640: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
c650: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
c660: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c670: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
c680: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
c690: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
c6a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
c6b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
c6c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
c6d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
c6e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
c6f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c700: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
c710: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
c720: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
c730: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
c740: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
c750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c760: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
c780: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
c790: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c7a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
c7b0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
c7c0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
c7d0: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
c7e0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
c7f0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
c800: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
c810: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c820: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c830: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
c860: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
c870: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
c880: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
c890: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
c8a0: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
c8b0: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
c8c0: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
c8d0: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
c8e0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
c8f0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
c900: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
c910: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
c920: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
c930: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
c940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
c950: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c960: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
c970: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
c980: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
c990: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
c9a0: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
c9b0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
c9c0: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c9e0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
c9f0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
ca00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
ca10: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
ca20: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
ca30: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
ca40: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
ca50: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
ca60: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
ca70: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
ca80: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ca90: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
caa0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
cab0: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
cac0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
cad0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cae0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
caf0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cb00: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
cb10: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
cb20: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
cb30: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
cb40: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cb50: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
cb60: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
cb70: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
cb80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
cb90: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
cba0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cbb0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
cbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
cbd0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
cbe0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  <=usableSize-4 )
cbf0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cc00: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
cc10: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
cc20: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
cc30: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
cc40: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
cc50: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
cc60: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
cc70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
cc80: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
cc90: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
cca0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
ccb0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
ccc0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
ccd0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
cce0: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
ccf0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
cd00: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
cd10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cd20: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
cd30: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
cd40: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
cd50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
cd60: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
cd70: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
cd80: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
cd90: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
cda0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
cdb0: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
cdc0: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
cdd0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
cde0: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
cdf0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ce00: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ce10: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
ce20: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
ce30: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
ce40: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
ce50: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
ce60: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
ce70: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
ce80: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
ce90: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cea0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
ceb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cec0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
ced0: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cee0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cef0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cf00: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cf10: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cf20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cf30: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cf40: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cf50: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cf60: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cf70: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cf80: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cf90: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cfb0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cfc0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cfe0: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cff0: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
d000: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
d010: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
d020: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
d030: 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b  dr+size ) break;
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b  .  }.  if( pc ){
d050: 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49  .    *pRc = SQLI
d060: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
d070: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
d080: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d090: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
d0a0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
d0b0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
d0c0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
d0d0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
d0e0: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
d0f0: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
d100: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
d110: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
d120: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
d130: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
d140: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
d150: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
d160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
d170: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
d180: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
d190: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
d1a0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
d1b0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
d1c0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
d1d0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
d1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d1f0: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
d200: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
d210: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
d220: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
d230: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
d240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d250: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
d260: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
d270: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
d280: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
d290: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
d2a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
d2b0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
d2c0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
d2d0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
d2e0: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
d2f0: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
d300: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
d310: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d320: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
d330: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d340: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
d350: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
d360: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
d370: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
d380: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d390: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d3a0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
d3b0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d3c0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
d3d0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d3e0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
d3f0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d420: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
d430: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
d440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
d470: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
d480: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
d490: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
d4a0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
d4b0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
d4c0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
d4d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
d4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d510: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
d520: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d530: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d540: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d550: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
d560: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
d570: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d580: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d590: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
d5a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d5b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
d5c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
d5d0: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
d5e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d5f0: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
d600: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
d610: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
d620: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
d630: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
d640: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
d650: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
d660: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
d670: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
d680: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
d690: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
d6a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
d6b0: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
d6c0: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
d6d0: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
d6e0: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
d6f0: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
d700: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
d710: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
d720: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
d730: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
d740: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
d750: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
d760: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
d770: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
d780: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
d790: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
d7a0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
d7b0: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
d7c0: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
d7d0: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
d7e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7f0: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
d800: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
d810: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d820: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
d830: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
d840: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
d850: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
d860: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
d870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
d880: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
d890: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
d8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d8b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d8c0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d8e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
d8f0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
d900: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
d910: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
d920: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
d930: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
d940: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
d950: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
d960: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
d970: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
d980: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
d990: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
d9a0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
d9b0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
d9c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d9d0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
d9e0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
d9f0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
da00: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
da10: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
da20: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
da30: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
da40: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
da50: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
da60: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
da70: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
da80: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
da90: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
daa0: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
dab0: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
dac0: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
dad0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
dae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
daf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
db00: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
db20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
db30: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
db40: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
db50: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
db60: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
db70: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
db80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
db90: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
dbb0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
dbc0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
dbd0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
dbe0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
dbf0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
dc00: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
dc10: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
dc20: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
dc30: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
dc40: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
dc50: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dc60: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
dc70: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
dc80: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
dc90: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
dca0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
dcb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
dcc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
dcd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
dce0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
dcf0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
dd00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
dd10: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
dd20: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
dd30: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
dd40: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
dd50: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
dd60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
dd70: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
dd80: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
dd90: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
dda0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
ddb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ddc0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
ddd0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
dde0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
ddf0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
de00: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
de10: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
de20: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
de30: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
de40: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
de50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
de60: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
de70: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
de80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
de90: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
dea0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
deb0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
dec0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
ded0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
dee0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
def0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
df00: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
df10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
df20: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
df30: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
df40: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
df50: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
df60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
df70: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
df80: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
df90: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
dfa0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
dfb0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
dfc0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
dfd0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
dfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
dff0: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e000: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e010: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e020: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e030: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e040: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e050: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e060: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e070: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e080: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e090: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e0b0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e0c0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e0e0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e0f0: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e100: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e110: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e140: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e150: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e160: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e190: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e1a0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e1b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e1e0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e1f0: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e200: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e220: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e230: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e240: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e250: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e260: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e270: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e280: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e2b0: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
e2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
e2d0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
e2e0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
e2f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
e300: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
e310: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
e320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e330: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e340: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
e350: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
e360: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
e370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e380: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
e390: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
e3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e3b0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e3c0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
e3d0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
e3e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
e400: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
e410: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
e420: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
e430: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e440: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e450: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e460: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
e470: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
e480: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e490: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
e4a0: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
e4b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
e4c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
e4d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
e4e0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
e4f0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
e500: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
e510: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
e520: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
e530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
e540: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
e550: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
e560: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
e570: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
e580: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
e590: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
e5a0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
e5b0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
e5c0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
e5d0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
e5e0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
e5f0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
e600: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e610: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
e620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
e630: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
e640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
e650: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
e660: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e670: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e680: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
e6a0: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e6b0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e6c0: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
e6d0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
e6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e700: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
e720: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
e730: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
e740: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e750: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
e760: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
e770: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
e780: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
e790: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
e7a0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
e7b0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
e7c0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
e7d0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
e7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e7f0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
e800: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
e810: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
e820: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
e830: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
e840: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
e850: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
e860: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
e870: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
e880: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
e890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e8a0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e8b0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
e8c0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
e8d0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
e8e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e8f0: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
e900: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
e910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e930: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e940: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
e950: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
e960: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
e970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e980: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
e990: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
e9a0: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
e9b0: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
e9c0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
e9d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
e9e0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
e9f0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
ea00: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
ea10: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
ea20: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
ea30: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
ea40: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
ea50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
ea60: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
ea70: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
ea80: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
ea90: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
eaa0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
eab0: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
eac0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
ead0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
eae0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eaf0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
eb00: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
eb10: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
eb20: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
eb30: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
eb40: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
eb50: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
eb60: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
eb70: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
eb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eb90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eba0: 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
ebb0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
ebc0: 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
ebd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ebe0: 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
ebf0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
ec00: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
ec10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
ec20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec30: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
ec40: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
ec50: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ec60: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
ec70: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
ec80: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
ec90: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
eca0: 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
ecb0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ecd0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ece0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ecf0: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
ed00: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
ed10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
ed20: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
ed30: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
ed40: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
ed50: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
ed60: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
ed70: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
ed80: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
ed90: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
eda0: 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
edb0: 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
edc0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
edd0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ede0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
edf0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ee00: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
ee10: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ee20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ee30: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
ee40: 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
ee50: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
ee60: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
ee70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
ee80: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
ee90: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
eea0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
eeb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
eed0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
eee0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
eef0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
ef00: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
ef10: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
ef20: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
ef30: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
ef40: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
ef50: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
ef60: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
ef70: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
ef80: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
ef90: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
efa0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
efb0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
efc0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
efd0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
efe0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
eff0: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
f000: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f010: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
f020: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f030: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f040: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
f060: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
f070: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
f080: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
f090: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
f0a0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
f0b0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
f0c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f0d0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
f0e0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
f0f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f110: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f120: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
f130: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
f140: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
f150: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
f160: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
f170: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
f180: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f190: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
f1a0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
f1b0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f1c0: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
f1d0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
f1e0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
f1f0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f200: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
f210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f220: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
f230: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
f240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f250: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f260: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
f270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
f2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
f2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
f2c0: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
f2d0: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
f2e0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f2f0: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
f300: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
f310: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f320: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
f330: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
f340: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
f350: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
f360: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f370: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
f380: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f390: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f3a0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f3b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f3d0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f3e0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
f3f0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f400: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
f410: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
f420: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
f430: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
f440: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
f450: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
f460: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
f470: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
f480: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
f490: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
f4a0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
f4b0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
f4c0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
f4d0: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
f4e0: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
f4f0: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
f500: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
f510: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
f520: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
f530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f540: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
f550: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
f560: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
f570: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
f580: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
f590: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f5a0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
f5b0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f5c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f5d0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f5e0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f5f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f600: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f610: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f620: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f630: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f640: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
f650: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
f660: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
f670: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
f680: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f690: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
f6a0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f6b0: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
f6c0: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
f6d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
f6e0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
f6f0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
f700: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f720: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
f730: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f740: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f750: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f770: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f780: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f790: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f7a0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f7b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f7c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f7d0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f7e0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f7f0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f800: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f810: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f820: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f830: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f840: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f850: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f860: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f870: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f880: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f890: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f8a0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f8b0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f8c0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f8e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f8f0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f900: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
f910: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f920: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
f930: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
f940: 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
f950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f960: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
f970: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
f980: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f9a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f9b0: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
f9c0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f9d0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f9e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
f9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
fa00: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
fa10: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
fa20: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
fa30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
fa40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
fa50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
fa60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
fa70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
fa80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
fa90: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
faa0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
fab0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fad0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
fae0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
faf0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
fb00: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fb10: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fb20: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb30: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
fb40: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
fb50: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
fb60: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
fb70: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
fb80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
fb90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
fbb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fbc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fbd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
fbe0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
fbf0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
fc00: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fc10: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fc20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
fc30: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
fc40: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
fc50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fc60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fc70: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
fc80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
fc90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
fcb0: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
fcc0: 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
fcd0: 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
fce0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
fcf0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
fd00: 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
fd10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
fd20: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
fd30: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
fd40: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
fd50: 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
fd60: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
fd70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
fd80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
fd90: 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
fda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fdb0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
fdc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
fdd0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fde0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
fdf0: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
fe00: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
fe10: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
fe20: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
fe30: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
fe40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
fe50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
fe60: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
fe70: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
fe80: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
fe90: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
fea0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
feb0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
fec0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
fed0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
fee0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
fef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ff00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ff10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ff20: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ff30: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
ff40: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
ff50: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
ff60: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
ff70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ff80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ff90: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ffa0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
ffb0: 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
ffc0: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
ffd0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
ffe0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fff0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
10000 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
10010 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
10020 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10030 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
10040 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
10050 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
10060 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
10070 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
10080 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
10090 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
100a0 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
100b0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
100c0 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
100d0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
100e0 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
100f0 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10120 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
10130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10150 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10160 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
10170 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
10180 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
10190 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  ich is only.  **
101a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
101b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
101c0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
101d0 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
101e0 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74   the.  ** offset
101f0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
10200 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
10210 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
10220 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a  ze minus the.  *
10230 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
10240 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
10250 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
10260 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
10270 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
10280 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a  RUPT_DB );..  /*
10290 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
102a0 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
102b0 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
102c0 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
102d0 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
102e0 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
102f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65    .  **.  ** The
10300 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
10310 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
10320 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
10330 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
10340 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
10350 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
10360 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
10370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
10380 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e   be .  ** return
10390 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
103a0 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   */.  iCellFirst
103b0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
103c0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
103d0 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
103e0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
103f0 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
10400 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
10410 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e  SizeCk ){.    in
10420 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10430 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10440 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10450 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
10460 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
10470 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
10480 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  */..    if( !pPa
10490 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
104a0 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28  Last--;.    for(
104b0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
104c0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
104d0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
104e0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
104f0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10510 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
10520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10530 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10540 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
10550 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
10560 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
10570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10580 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
105a0 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
105b0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
105c0 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
105d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
105e0 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
105f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
10600 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10630 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10650 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10660 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
10670 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
10680 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
10690 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
106a0 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
106b0 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
106c0 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
106d0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
106e0 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
106f0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
10700 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
10710 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
10720 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
10730 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
10740 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
10750 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10760 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
10770 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10780 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10790 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
107a0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
107b0 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
107c0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
107d0 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
107e0 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
107f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
10800 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
10810 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
10820 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
10830 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
10840 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
10850 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
10860 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
10870 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
10880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
108a0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
108b0 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
108c0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
108d0 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
108e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
108f0 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
10900 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
10910 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
10920 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10930 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10940 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
10950 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10960 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
10970 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
10980 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
10990 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
109a0 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
109b0 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
109c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
109d0 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
109e0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
109f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
10a00 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
10a10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10a40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10a50 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
10a60 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
10a70 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10a80 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
10a90 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
10aa0 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
10ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ac0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10ad0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
10ae0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10af0 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
10b00 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
10b10 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10b20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10b30 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b40 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
10b50 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
10b60 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
10b70 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b80 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
10b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10ba0 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
10bb0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
10bc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
10bd0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
10be0 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
10bf0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
10c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
10c10 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
10c20 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
10c30 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
10c40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
10c50 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
10c60 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
10c70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10c80 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
10c90 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10cb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
10cc0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10cd0 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
10ce0 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
10cf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
10d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
10d20 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
10d30 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
10d40 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
10d50 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
10d60 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
10d70 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
10d80 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
10d90 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
10da0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10db0 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10dc0 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
10dd0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
10de0 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
10df0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10e00 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
10e10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e20 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
10e30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10e40 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
10e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10e70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10e80 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
10e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10eb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10ec0 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10ee0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10ef0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10f00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10f10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10f20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10f30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10f40 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
10f50 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
10f60 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
10f70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10f80 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10f90 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10fa0 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
10fb0 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
10fc0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
10fd0 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
10fe0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
10ff0 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
11000 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
11010 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
11020 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11030 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
11040 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
11050 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
11060 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
11070 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
11080 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11090 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
110a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
110b0 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
110c0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
110d0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
110e0 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
110f0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
11100 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
11110 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
11120 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11130 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
11140 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
11150 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
11160 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11170 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11180 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11190 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
111a0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
111b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
111c0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
111d0 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
111e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
111f0 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
11200 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
11210 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
11230 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
11240 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
11250 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
11260 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
11270 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
11280 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11290 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
112a0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
112b0 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
112c0 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
112d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
112e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
112f0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
11300 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
11310 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
11320 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11330 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
11340 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
11350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
11360 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
11370 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
11390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
113a0 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
113b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
113d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
113e0 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
113f0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11400 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11410 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
11420 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
11430 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
11440 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
11450 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
11460 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
11470 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11480 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11490 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
114a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
114b0 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
114c0 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
114d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
114e0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
114f0 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11500 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11510 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
11520 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
11530 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
11540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11550 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
11560 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
11570 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
11580 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
11590 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
115a0 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
115b0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
115c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
115d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
115e0 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
115f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11600 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11610 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11630 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11640 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11650 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11670 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11680 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11690 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
116a0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
116b0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
116c0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
116d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
116e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
116f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
11700 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
11710 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11720 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
11730 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
11740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11780 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
11790 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
117a0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
117b0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
117c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
117d0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
117e0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
117f0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
11800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
11820 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
11830 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
11840 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
11850 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11860 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
11870 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
11880 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
11890 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
118a0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
118b0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
118c0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
118d0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
118e0 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
118f0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
11900 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11910 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
11950 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
11960 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
11970 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
11980 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
11990 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
119a0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119b0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119c0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
119d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
119e0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11a00 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
11a10 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
11a20 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
11a30 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
11a40 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
11a50 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
11a60 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
11a70 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
11a80 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
11a90 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
11aa0 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
11ab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
11ac0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
11ad0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
11ae0 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
11af0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
11b00 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11b10 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11b20 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
11b30 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11b40 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
11b50 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
11b60 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
11b70 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
11b80 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
11b90 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
11ba0 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
11bb0 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
11bc0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
11bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
11be0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
11bf0 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
11c00 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
11c10 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
11c20 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
11c30 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
11c40 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
11c50 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
11c60 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
11c70 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
11c80 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
11c90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11ca0 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
11cb0 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
11cc0 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
11cd0 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
11ce0 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
11cf0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
11d00 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
11d10 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
11d20 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11d30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11d40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11d50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
11d60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d80 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11d90 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
11da0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
11db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
11dd0 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
11de0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
11df0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
11e00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
11e10 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
11e20 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
11e30 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
11e60 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
11e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
11e80 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
11e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11ec0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11ed0 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
11ee0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
11ef0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
11f00 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
11f10 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
11f20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f30 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
11f40 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
11f50 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
11f60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
11f70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11f80 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
11f90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11fa0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
11fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
11fd0 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
11fe0 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
11ff0 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
12000 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12010 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12020 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
12030 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
12040 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
12050 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
12060 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
12070 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
120b0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
120c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
120f0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
12100 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12110 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
12120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
12130 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
12140 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12150 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
12160 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12170 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
12190 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
121a0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
121b0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
121c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
121d0 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
121e0 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
121f0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
12200 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
12210 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
12220 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
12230 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
12240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12250 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
12260 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65  (pgno);.    rele
12270 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
12280 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12290 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
122a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
122b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64  LITE_OK;..getAnd
122c0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a  InitPage_error:.
122d0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
122e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
122f0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
12300 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
12310 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
12320 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  }.  testcase( pg
12330 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
12340 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
12350 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
12360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
12370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
12380 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
12390 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
123a0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
123b0 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
123c0 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
123d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20  .**.** Page1 is 
123e0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 61  a special case a
123f0 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61  nd must be relea
12400 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73  sed using releas
12410 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73  ePageOne()..*/.s
12420 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12430 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
12440 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12470 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
12480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12490 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
124a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
124c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
124d0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
124e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
124f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12510 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
12520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12540 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12550 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
12560 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
12570 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12580 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12590 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
125a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
125b0 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
125c0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
125d0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
125e0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
125f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12600 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12610 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
12620 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
12630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12640 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
12650 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
12660 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12670 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12680 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
12690 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
126a0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
126b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
126c0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
126d0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
126e0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
126f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
12720 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12730 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70  PageOne(pPage->p
12740 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
12750 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
12760 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
12770 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
12780 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
12790 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
127a0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
127b0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
127c0 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
127d0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
127e0 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
127f0 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
12800 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
12810 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
12820 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
12830 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
12840 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
12850 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
12860 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
12870 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
12880 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
12890 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
128a0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
128b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
128c0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
128d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
128e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
128f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
12900 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
12910 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
12930 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12940 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12950 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12960 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
12970 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
12980 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
12990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
129a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
129b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
129c0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
129d0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
129e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
129f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12a00 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
12a40 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
12a50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
12a60 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
12a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a80 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
12a90 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
12aa0 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
12ab0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
12ac0 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
12ad0 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
12ae0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
12af0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
12b00 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
12b10 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
12b20 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
12b30 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
12b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12b50 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
12b60 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
12b70 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
12b80 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
12b90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
12ba0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
12bb0 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12bc0 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
12bd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
12be0 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
12bf0 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
12c00 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
12c10 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
12c20 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
12c30 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
12c40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
12c50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12c60 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
12c70 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
12c80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12ca0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
12cc0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
12cd0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12ce0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12cf0 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
12d00 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
12d10 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
12d20 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
12d30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
12d40 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
12d50 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
12d60 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
12d70 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
12d80 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
12d90 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
12da0 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
12db0 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
12dc0 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
12dd0 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
12de0 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
12df0 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
12e00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
12e10 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
12e20 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
12e30 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
12e40 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
12e50 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
12e60 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
12e70 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
12e80 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
12e90 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
12ea0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12eb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ec0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
12ed0 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
12ee0 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
12ef0 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
12f00 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
12f10 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
12f20 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
12f30 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
12f40 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12f60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12f70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
12f80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
12f90 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
12fa0 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
12fb0 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
12fc0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
12fd0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
12fe0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
12ff0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
13000 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
13010 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
13020 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
13030 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13040 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
13050 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
13060 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
13070 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
13080 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
13090 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
130a0 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
130b0 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
130c0 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
130d0 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
130e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
130f0 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
13100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13110 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
13120 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
13130 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
13140 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
13150 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
13160 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
13170 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
13180 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
13190 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
131a0 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
131b0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
131c0 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
131d0 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
131e0 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
131f0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
13200 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
13210 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
13220 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
13230 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
13240 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13250 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
13260 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
13270 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
13280 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
13290 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
132a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
132b0 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
132c0 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
132d0 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
132e0 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
132f0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
13300 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
13310 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
13320 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
13330 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
13340 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13350 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
13360 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
13370 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
13380 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
13390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
133a0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
133b0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
133c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
133d0 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
133e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
13400 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
13410 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
13420 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
13430 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
13440 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
13450 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
13460 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13480 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
13490 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
134a0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
134b0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
134c0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
134d0 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
134e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
134f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13500 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
13510 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
13520 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
13550 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
13560 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
13570 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
13580 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
13590 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
135a0 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
135b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
135c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
135d0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
135e0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
135f0 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13610 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
13620 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
13630 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
13640 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
13650 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
13660 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
13670 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
13680 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
13690 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
136a0 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
136b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
136c0 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
136d0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
136e0 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
136f0 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
13700 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
13710 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
13720 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
13730 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
13740 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
13750 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
13760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
13770 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
13780 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
13790 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
137a0 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
137b0 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
137c0 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
137d0 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
13800 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
13810 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
13840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
13850 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
13860 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
13870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
13880 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
13890 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
138a0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
138b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
138c0 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
138d0 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
138e0 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
138f0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
13900 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
13910 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
13920 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
13930 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
13940 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13950 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13960 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
13970 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
13980 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13990 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
139a0 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
139b0 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
139c0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
139d0 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
139e0 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
139f0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13a00 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
13a10 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
13a20 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
13a30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
13a40 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
13a50 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
13a60 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
13a70 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
13a80 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
13a90 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
13aa0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
13ab0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
13ac0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
13ad0 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
13ae0 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
13af0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13b00 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  PT;.  }.  p->inT
13b10 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
13b20 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
13b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13b40 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13b50 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
13b60 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
13b70 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
13b80 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
13b90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
13ba0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
13bb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13bc0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
13bd0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
13be0 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
13bf0 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
13c00 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
13c10 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
13c20 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
13c30 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
13c40 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
13c50 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
13c60 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
13c70 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
13c80 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
13c90 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
13ca0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13cb0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
13cc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69  ){.      int nFi
13cd0 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
13ce0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
13cf0 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  me)+1;.      int
13d00 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
13d10 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
13d20 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
13d30 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
13d40 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d   sqlite3Malloc(M
13d50 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  AX(nFullPathname
13d60 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  ,nFilename));.  
13d70 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13d90 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a  mutexShared; )..
13da0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
13db0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
13dc0 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
13dd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13de0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
13df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13e00 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13e10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13e20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
13e30 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
13e40 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
13e50 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
13e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e80 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
13e90 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d      nFullPathnam
13ed0 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
13ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13ef0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  c ){.          s
13f00 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
13f10 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13f30 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
13f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
13f60 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
13f70 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  AFE.      mutexO
13f80 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
13f90 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13fa0 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
13fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13fc0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
13fd0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
13fe0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
13ff0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14000 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14010 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
14020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14030 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
14040 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
14050 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
14060 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14070 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14080 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
14090 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
140a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
140b0 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
140c0 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
140d0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
140e0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
140f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
14100 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
14110 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
14120 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
14130 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
14140 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
14150 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
14160 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
14170 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
14180 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
14190 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
141a0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
141b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
141c0 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
141d0 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
141e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
141f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14200 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14230 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14250 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
14260 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
14270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14280 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
14290 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
142a0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
142b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
142c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
142d0 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
142e0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
142f0 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
14300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14310 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14320 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14330 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14340 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
14350 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14360 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
14370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
14380 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
14390 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
143a0 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
143b0 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
143c0 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
143d0 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
143e0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
143f0 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
14400 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
14410 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
14420 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
14430 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
14440 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
14450 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
14460 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
14470 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
14480 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
14490 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
144a0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
144b0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
144c0 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
144d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
144e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
144f0 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
14500 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
14510 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
14520 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
14530 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
14540 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
14550 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
14560 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
14570 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
14580 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
14590 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
145a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
145b0 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
145c0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
145d0 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
145e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
145f0 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
14600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14610 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
14620 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14630 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
14640 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
14650 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
14660 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
14670 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
14680 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14690 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
146a0 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
146b0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
146c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
146d0 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
146e0 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
146f0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67     sizeof(MemPag
14720 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  e), flags, vfsFl
14730 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
14740 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14760 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14770 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
14780 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
14790 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
147a0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
147b0 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
147c0 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
147d0 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
147e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
147f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14800 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
14810 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14820 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
14830 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
14840 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
14850 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
14860 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
14870 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
14880 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
14890 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
148a0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
148b0 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
148c0 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
148d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
148e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
148f0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
14900 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
14910 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14920 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
14930 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14940 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
14950 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14960 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
14970 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65  DELETE;.#elif de
14980 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53  fined(SQLITE_FAS
14990 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  T_SECURE_DELETE)
149a0 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
149b0 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52  gs |= BTS_OVERWR
149c0 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ITE;.#endif.    
149d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
149e0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
149f0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
14a00 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
14a10 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
14a20 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
14a30 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
14a40 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
14a50 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
14a60 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
14a70 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
14a80 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
14a90 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14aa0 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
14ab0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
14ac0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
14ad0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
14ae0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
14af0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
14b00 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
14b10 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
14b20 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
14b30 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
14b40 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
14b50 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
14b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14b70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
14b80 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
14b90 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
14ba0 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
14bb0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
14bc0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
14bd0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
14be0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
14bf0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
14c00 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
14c10 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
14c20 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
14c30 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
14c40 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
14c50 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
14c60 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
14c70 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
14c80 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
14c90 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
14ca0 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
14cb0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
14cc0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
14cd0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
14ce0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
14cf0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
14d00 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
14d10 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
14d20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14d30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14d40 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
14d50 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
14d60 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
14d70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d80 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
14d90 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
14da0 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
14db0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
14dc0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
14dd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
14de0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
14df0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
14e00 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
14e10 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
14e20 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
14e30 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
14e40 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
14e50 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
14e60 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
14e70 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
14e80 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
14e90 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
14ea0 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
14eb0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
14ec0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
14ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14ee0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14ef0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
14f00 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
14f10 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
14f20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
14f30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14f40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
14f50 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
14f60 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
14f70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
14f80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
14f90 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
14fa0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
14fb0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
14fc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
14fd0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
14fe0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
14ff0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
15000 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
15010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
15020 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
15030 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
15040 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
15050 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
15060 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15070 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15080 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
15090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
150a0 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
150b0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
150c0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
150d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
150e0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
150f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
15100 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69  >nRef = 1;.    i
15110 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
15120 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
15130 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
15140 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
15150 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c   ).      MUTEX_L
15160 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
15170 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
15180 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
15190 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
151a0 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
151b0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
151c0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
151d0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
151e0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
151f0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
15200 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15210 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
15220 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
15230 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
15240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15250 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15260 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
15270 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15290 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
152a0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
152b0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
152c0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
152d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
152e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
152f0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
15300 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15310 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15320 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
15330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15340 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
15350 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
15360 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
15370 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
15380 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
15390 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
153a0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
153b0 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
153c0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
153d0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
153e0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
153f0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
15400 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
15410 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
15420 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
15430 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
15440 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
15450 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
15460 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
15470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
15480 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
15490 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
154a0 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
154b0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
154c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
154d0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
154e0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
154f0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
15500 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
15510 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
15520 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
15530 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
15540 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74  uptr)p->pBt<(upt
15550 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  r)pSib->pBt ){. 
15560 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
15570 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
15580 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
15590 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
155a0 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
155b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
155c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
155d0 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74  b->pNext && (upt
155e0 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  r)pSib->pNext->p
155f0 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20  Bt<(uptr)p->pBt 
15600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
15610 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
15620 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
15630 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
15640 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
15650 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
15660 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
15670 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
15680 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
15690 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
156a0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
156b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
156c0 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
156d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
156e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
156f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15700 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
15710 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
15720 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15740 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
15750 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
15760 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
15770 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  t->pPager, 0);. 
15780 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15790 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
157a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
157b0 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
157c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
157d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
157e0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ile;..    /* If 
157f0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
15800 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
15810 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
15820 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
15830 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
15840 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
15850 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
15860 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
15870 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
15880 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
15890 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
158a0 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
158b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
158c0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
158d0 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
158e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
158f0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
15900 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
15910 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
15920 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a  E_SIZE);.    }..
15930 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69      pFile = sqli
15940 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
15950 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
15960 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
15970 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ds ){.      sqli
15980 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
15990 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
159a0 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76  TE_FCNTL_PDB, (v
159b0 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a  oid*)&pBt->db);.
159c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
159d0 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
159e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
159f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
15a00 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
15a10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15a20 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
15a30 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
15a40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
15a50 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
15a60 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65  ionCount(*ppBtre
15a70 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  e)>0 );.  return
15a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
15a90 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
15aa0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
15ab0 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
15ac0 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
15ad0 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
15ae0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
15af0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15b00 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
15b10 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
15b20 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
15b30 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
15b40 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
15b50 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
15b60 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
15b70 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
15b80 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
15b90 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
15ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15bb0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15bc0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
15bd0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
15be0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
15bf0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
15c00 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
15c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15c20 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
15c30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
15c40 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
15c50 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
15c60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15c70 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
15c80 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
15c90 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
15ca0 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
15cb0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
15cc0 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
15cd0 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
15ce0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15cf0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
15d00 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
15d10 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15d20 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15d30 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
15d40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15d50 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
15d60 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15d70 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15d80 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
15d90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
15da0 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
15db0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
15dc0 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
15dd0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
15de0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
15df0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
15e00 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
15e10 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
15e20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15e30 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
15e40 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
15e50 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
15e60 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
15e70 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
15e80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
15e90 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
15ea0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
15eb0 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
15ec0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
15ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15ee0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
15ef0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
15f00 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
15f10 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
15f20 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
15f30 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
15f40 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
15f50 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
15f60 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
15f70 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
15f80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15f90 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
15fa0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
15fb0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
15fc0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
15fd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
15fe0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
15ff0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
16000 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
16010 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
16020 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
16030 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
16040 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
16050 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
16060 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
16070 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
16080 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
16090 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
160a0 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
160b0 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
160c0 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
160d0 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
160e0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
160f0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
16100 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
16110 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
16120 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
16130 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
16140 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
16150 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
16160 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
16170 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
16180 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
16190 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
161a0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
161b0 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
161c0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
161d0 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
161e0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
161f0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
16200 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
16210 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
16220 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
16230 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
16240 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
16250 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
16260 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
16270 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
16280 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
16290 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
162a0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
162b0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
162c0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
162d0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
162e0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
162f0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
16300 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
16310 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
16320 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
16330 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
16340 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
16350 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
16360 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16370 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
16380 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
16390 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
163a0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
163b0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
163c0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
163d0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
163e0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
163f0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
16400 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
16410 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
16420 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16430 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
16440 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
16450 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
16460 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
16470 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
16480 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
16490 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
164a0 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
164b0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
164c0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
164d0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
164e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
164f0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
16500 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
16510 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
16520 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
16530 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
16540 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16550 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16560 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16570 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16580 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
16590 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
165a0 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
165b0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
165c0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
165d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
165e0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
165f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16600 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
16610 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
16620 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
16630 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
16640 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
16650 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
16660 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
16670 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
16680 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
16690 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
166a0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
166b0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
166c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
166d0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
166e0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
166f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16700 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
16710 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
16720 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
16730 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
16740 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
16750 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
16760 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
16770 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
16780 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
16790 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
167a0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
167b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
167c0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
167d0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
167e0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
167f0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
16800 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
16810 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
16820 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
16830 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
16840 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
16850 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
16860 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
16870 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
16880 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
16890 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
168a0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
168b0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
168c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
168d0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
168e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
168f0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
16900 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  , p->db);.    if
16910 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
16920 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
16930 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
16940 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
16950 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
16960 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
16970 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
16980 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
16990 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
169a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
169b0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
169c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
169d0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
169e0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
169f0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
16a00 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
16a10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
16a20 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
16a30 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16a40 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16a50 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16a60 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
16a70 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
16a80 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
16a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16aa0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16ab0 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
16ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16ad0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16ae0 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
16af0 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
16b00 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
16b10 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
16b20 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
16b30 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
16b40 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
16b50 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
16b60 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
16b70 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
16b80 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
16b90 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
16ba0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
16bb0 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
16bc0 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
16bd0 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
16be0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
16bf0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
16c00 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16c10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16c20 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16c30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16c40 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16c50 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16c60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16c80 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
16c90 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16ca0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16cb0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16cd0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16ce0 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
16cf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16d00 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
16d10 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
16d20 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
16d30 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
16d40 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
16d50 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
16d60 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
16d70 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
16d80 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
16d90 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
16da0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
16db0 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
16dc0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
16dd0 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
16de0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
16df0 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
16e00 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
16e10 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
16e20 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
16e30 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
16e40 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
16e50 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
16e60 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
16e70 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
16e80 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
16e90 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
16ea0 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
16eb0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16ec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16ed0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
16ee0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
16ef0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16f00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16f10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16f20 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
16f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16f40 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
16f50 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16f70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16f80 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
16f90 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
16fa0 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
16fb0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
16fc0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
16fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
16fe0 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
16ff0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
17000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17010 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
17020 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
17030 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
17040 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17050 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17070 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17080 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17090 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
170a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
170b0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
170c0 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
170d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
170e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
170f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
17110 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
17120 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17130 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
17140 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
17150 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
17160 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
17170 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
17180 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
17190 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
171a0 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
171b0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
171c0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
171d0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
171e0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
171f0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
17200 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
17210 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17220 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
17230 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
17240 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
17250 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
17260 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
17270 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
17280 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
17290 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
172a0 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
172b0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
172c0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
172d0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
172e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
172f0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
17300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17310 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
17320 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
17330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17340 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
17350 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
17360 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
17370 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
17380 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
17390 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
173a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
173b0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
173c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
173d0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
173e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
173f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
17400 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
17410 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
17420 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
17430 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17440 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17450 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
17460 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17470 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
17480 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
17490 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
174a0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
174b0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
174c0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
174d0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
174e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
174f0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
17500 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
17510 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
17520 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
17530 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
17540 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
17550 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
17560 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
17570 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
17580 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
17590 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
175a0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
175b0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
175c0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
175d0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
175e0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
175f0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
17600 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
17610 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
17620 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
17630 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
17640 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
17650 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
17660 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
17670 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
17680 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
17690 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
176a0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
176b0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
176c0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
176d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
176e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
176f0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
17700 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
17710 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
17720 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
17730 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
17740 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
17750 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
17760 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
17770 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
17780 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
17790 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
177a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
177b0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
177c0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
177d0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
177e0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
177f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17800 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
17810 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
17820 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
17830 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
17840 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
17850 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
17860 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
17870 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
17880 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
17890 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
178a0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
178b0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
178c0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
178d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
178e0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
178f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17900 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
17910 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17920 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
17930 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
17940 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
17950 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
17960 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
17970 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
17980 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
17990 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
179a0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
179b0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
179c0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
179d0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
179e0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
179f0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
17a00 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
17a10 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
17a20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
17a30 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
17a40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
17a50 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
17a60 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
17a70 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
17a80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
17a90 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
17aa0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
17ab0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
17ac0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17ad0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17ae0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
17af0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
17b00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17b10 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17b20 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
17b30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
17b60 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
17b70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
17b80 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
17b90 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
17ba0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
17bb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
17bc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17bd0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
17be0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
17bf0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
17c00 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
17c10 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
17c20 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
17c30 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
17c40 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
17c50 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
17c60 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
17c70 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
17c80 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
17c90 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
17ca0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
17cb0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
17cc0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
17cd0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
17ce0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
17cf0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
17d00 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
17d10 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
17d20 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
17d30 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
17d40 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
17d50 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
17d60 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
17d70 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
17d80 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
17d90 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17da0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
17db0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
17dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17dd0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17de0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
17df0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
17e00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17e10 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
17e20 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
17e30 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17e40 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
17e50 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
17e60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
17e70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17e80 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
17e90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
17ea0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
17eb0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
17ec0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
17ed0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
17ee0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
17ef0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
17f00 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
17f10 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
17f20 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
17f30 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
17f40 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
17f50 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
17f60 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
17f70 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
17f80 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
17f90 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
17fa0 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
17fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17fc0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
17fd0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
17fe0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
17ff0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18000 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
18010 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
18020 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
18030 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18040 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
18050 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
18060 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
18070 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
18080 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
18090 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
180a0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
180b0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
180c0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
180d0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
180e0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
180f0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
18100 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
18110 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
18120 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
18130 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
18140 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
18150 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
18160 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
18170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
18180 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
18190 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
181a0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
181b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
181c0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
181d0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
181e0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
181f0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
18200 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18210 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
18220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
18230 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
18240 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
18250 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  ETE and BTS_OVER
18260 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a  WRITE flags:.**.
18270 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30  **    newFlag==0
18280 20 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f         Both BTS_
18290 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e  SECURE_DELETE an
182a0 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
182b0 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20  are cleared.**  
182c0 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20    newFlag==1    
182d0 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45     BTS_SECURE_DE
182e0 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53  LETE set and BTS
182f0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c  _OVERWRITE is cl
18300 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46  eared.**    newF
18310 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53  lag==2       BTS
18320 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63  _SECURE_DELETE c
18330 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f  leared and BTS_O
18340 56 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a  VERWRITE is set.
18350 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28  **    newFlag==(
18360 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65  -1)    No change
18370 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  s.**.** This rou
18380 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71  tine acts as a q
18390 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20  uery if newFlag 
183a0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
183b0 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53  o.**.** With BTS
183c0 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20  _OVERWRITE set, 
183d0 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
183e0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  is overwritten b
183f0 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20  y zeros, but.** 
18400 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
18410 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74  ges are not writ
18420 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
18430 64 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20  database.  Thus 
18440 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74  in-page.** delet
18450 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c  ed content is cl
18460 65 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c  eared, but freel
18470 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  ist deleted cont
18480 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ent is not..**.*
18490 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52  * With BTS_SECUR
184a0 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74  E_DELETE, operat
184b0 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f  ion is like BTS_
184c0 4f 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74  OVERWRITE with t
184d0 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74  he addition.** t
184e0 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61  hat freelist lea
184f0 66 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  f pages are writ
18500 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
18510 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72  e database, incr
18520 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d  easing.** the am
18530 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f  ount of disk I/O
18540 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18550 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
18560 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
18570 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
18580 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
18590 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
185a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
185b0 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
185c0 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53  OVERWRITE==BTS_S
185d0 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29  ECURE_DELETE*2 )
185e0 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
185f0 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54  FAST_SECURE==(BT
18600 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f  S_OVERWRITE|BTS_
18610 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29  SECURE_DELETE) )
18620 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
18630 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
18640 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
18650 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a  TS_FAST_SECURE;.
18660 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
18670 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
18680 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61  RE_DELETE*newFla
18690 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d  g;.  }.  b = (p-
186a0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
186b0 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
186c0 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  )/BTS_SECURE_DEL
186d0 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ETE;.  sqlite3Bt
186e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
186f0 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn b;.}../*.*
18700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
18710 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
18720 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
18730 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
18740 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
18750 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
18760 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
18770 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
18780 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
18790 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
187a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
187b0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
187c0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
187d0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
187e0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
187f0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
18800 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
18810 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
18820 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
18830 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
18840 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
18850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
18860 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
18870 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
18880 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
18890 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
188a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
188b0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
188c0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
188d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
188e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
188f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18900 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18910 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
18920 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
18930 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
18940 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
18960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
18970 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
18980 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
18990 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
189a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
189b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
189c0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
189d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
189e0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
189f0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
18a00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
18a10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
18a20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
18a30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
18a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18a50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
18a60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
18a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18a80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
18a90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
18aa0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
18ab0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
18ac0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18ad0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
18ae0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
18af0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
18b10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
18b20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
18b30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
18b40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
18b50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
18b60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
18b80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ndif.}../*.** If
18b90 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f   the user has no
18ba0 74 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  t set the safety
18bb0 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20  -level for this 
18bc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18bd0 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52  ion.** using "PR
18be0 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
18bf0 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61  ", and if the sa
18c00 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f  fety-level is no
18c10 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74  t already.** set
18c20 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
18c30 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
18c40 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63  ction as the sec
18c50 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a  ond parameter,.*
18c60 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a  * set it so..*/.
18c70 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
18c80 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d  LT_SYNCHRONOUS!=
18c90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18ca0 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c  AL_SYNCHRONOUS \
18cb0 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64  .    && !defined
18cc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
18cd0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
18ce0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
18cf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18d00 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  u8 safety_level)
18d10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18d20 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66  .  Db *pDb;.  if
18d30 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d  ( (db=pBt->db)!=
18d40 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44  0 && (pDb=db->aD
18d50 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  b)!=0 ){.    whi
18d60 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  le( pDb->pBt==0 
18d70 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74  || pDb->pBt->pBt
18d80 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20  !=pBt ){ pDb++; 
18d90 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62  }.    if( pDb->b
18da0 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20  SyncSet==0 .    
18db0 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f   && pDb->safety_
18dc0 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65  level!=safety_le
18dd0 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62  vel .     && pDb
18de0 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20  !=&db->aDb[1] . 
18df0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d     ){.      pDb-
18e00 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20  safety_level;.  
18e20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18e30 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
18e40 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
18e50 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18e60 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  l | (db->flags &
18e70 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
18e80 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  K));.    }.  }.}
18e90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18ea0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
18eb0 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65  ag(pBt,safety_le
18ec0 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  vel).#endif../*.
18ed0 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
18ee0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
18ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18f00 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
18f10 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
18f20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
18f30 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
18f40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18f50 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
18f60 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
18f70 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
18f80 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
18f90 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
18fa0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
18fb0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
18fc0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
18fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18fe0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
18ff0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
19000 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
19010 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
19020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
19030 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
19040 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
19050 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19060 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19070 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19080 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
19090 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
190a0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
190b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
190c0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
190d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
190e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
190f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19100 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
19110 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19120 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
19130 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
19140 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
19150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19160 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19170 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
19180 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
19190 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
191a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
191b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
191c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
191d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
191e0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
191f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
19200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19210 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19220 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
19230 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
19240 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
19250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19260 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
19270 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
19280 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
19290 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
192a0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
192b0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
192c0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
192d0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
192e0 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
192f0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
19300 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
19310 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19320 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
19330 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
19340 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
19350 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
19360 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
19370 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19380 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
19390 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
193a0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
193b0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
193c0 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
193d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
193e0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
193f0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
19400 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19410 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19420 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
19430 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
19440 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
19450 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
19460 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
19470 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
19480 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
19490 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
194a0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
194b0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
194c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
194d0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
194e0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
194f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19500 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19510 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19520 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
19530 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
19540 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
19550 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
19560 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
19570 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
19580 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
19590 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
195a0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
195b0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
195c0 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
195d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
195e0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
195f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
19600 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
19610 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19620 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19630 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
19640 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
19650 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
19660 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
19670 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
19680 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
19690 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
196a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
196b0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
196c0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
196d0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
196e0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
196f0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
19700 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
19710 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
19720 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
19730 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
19740 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
19750 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
19760 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
19770 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
19780 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
19790 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
197a0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
197b0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
197c0 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
197d0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
197e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
197f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
19800 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
19810 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
19820 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
19830 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
19840 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
19850 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19860 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
19870 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
19880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
198a0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
198b0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
198c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44  se{.        setD
198d0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
198e0 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
198f0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
19900 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  US+1);.        i
19910 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
19920 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
19930 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
19940 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19980 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
19990 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
199a0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
199b0 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
199c0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
199d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
199e0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
199f0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
19a00 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
19a10 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
19a20 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
19a30 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
19a40 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19a50 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19a60 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19a70 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19a80 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
19a90 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
19aa0 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
19ab0 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
19ac0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
19ad0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
19ae0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
19af0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
19b00 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
19b10 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
19b20 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
19b30 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19b40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19b50 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19b60 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19b70 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19b80 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
19b90 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
19ba0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19bb0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
19bc0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
19bd0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
19be0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
19bf0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19c00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19c10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
19c20 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
19c30 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
19c40 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19c50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19c60 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19c70 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19c80 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
19c90 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
19ca0 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
19cb0 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
19cc0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
19cd0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
19ce0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
19cf0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
19d00 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
19d10 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
19d20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19d30 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19d40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19d50 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19d60 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
19d70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
19d80 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
19d90 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
19da0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
19db0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
19dc0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
19dd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19de0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
19df0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
19e00 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
19e10 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
19e20 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
19e30 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
19e40 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
19e50 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
19e60 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
19e70 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
19e80 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
19e90 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
19ea0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
19eb0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
19ec0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
19ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19ee0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
19ef0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
19f00 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
19f10 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
19f20 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
19f30 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
19f40 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
19f50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19f60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
19f70 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
19f80 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
19f90 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
19fa0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
19fb0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
19fc0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
19fd0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
19fe0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
19ff0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1a000 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1a010 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1a020 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1a030 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1a040 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1a050 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1a060 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1a070 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1a080 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1a090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1a0a0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1a0b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a0c0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1a0d0 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1a0e0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1a0f0 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1a100 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1a110 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a120 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1a130 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1a140 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1a170 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1a180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a190 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1a1a0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
1a1b0 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
1a1c0 63 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61  chema)==0 && nPa
1a1d0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
1a1e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a1f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a200 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a210 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a220 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
1a230 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
1a240 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
1a250 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
1a260 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
1a270 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
1a280 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
1a290 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
1a2a0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
1a2b0 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
1a2c0 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
1a2d0 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
1a2e0 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
1a2f0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
1a300 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
1a310 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a320 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
1a330 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1a340 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
1a350 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
1a360 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
1a370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a380 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
1a390 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
1a3a0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1a3b0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
1a3c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
1a3d0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1a3e0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
1a3f0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
1a400 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
1a410 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
1a420 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
1a430 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
1a440 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
1a450 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
1a460 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
1a470 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
1a480 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
1a490 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
1a4a0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
1a4b0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
1a4c0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
1a4d0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
1a4e0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
1a4f0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
1a500 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
1a510 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
1a520 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
1a530 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
1a540 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
1a550 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
1a560 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1a570 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
1a580 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
1a590 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
1a5a0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
1a5b0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
1a5c0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
1a5d0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
1a5e0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
1a5f0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
1a600 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
1a610 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
1a620 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
1a630 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
1a640 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
1a650 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
1a660 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1a670 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a680 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
1a690 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
1a6a0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a6b0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1a6c0 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
1a6d0 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
1a6e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1a6f0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
1a700 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
1a710 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a720 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1a730 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
1a740 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
1a750 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1a760 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
1a770 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
1a780 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1a790 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
1a7a0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
1a7b0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
1a7c0 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
1a7d0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
1a7e0 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
1a7f0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
1a800 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1a810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
1a820 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
1a830 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e  .  releasePageOn
1a840 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
1a850 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1a860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a870 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1a880 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1a890 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
1a8a0 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
1a8b0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
1a8c0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
1a8d0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
1a8e0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
1a8f0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
1a900 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
1a910 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
1a920 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1a930 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
1a940 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
1a950 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
1a960 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1a970 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
1a980 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
1a990 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1a9a0 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
1a9b0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
1a9c0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
1a9d0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1a9e0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1a9f0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
1aa00 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
1aa10 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
1aa20 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
1aa30 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
1aa40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1aa50 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1aa60 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
1aa70 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
1aa80 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
1aa90 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
1aaa0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
1aab0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
1aac0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
1aad0 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
1aae0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
1aaf0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
1ab00 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
1ab10 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1ab20 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
1ab30 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
1ab40 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
1ab50 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
1ab60 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1ab70 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
1ab80 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
1ab90 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
1aba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
1abb0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
1abc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1abd0 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
1abe0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
1abf0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1ac00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ac10 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
1ac20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1ac30 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
1ac40 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
1ac50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
1ac60 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1ac70 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
1ac80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1ac90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aca0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1acb0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
1acc0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1acd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ace0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1acf0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
1ad00 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
1ad10 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
1ad20 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
1ad30 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
1ad40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ad50 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1ad60 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
1ad70 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1ad80 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1ad90 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
1ada0 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
1adb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1adc0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1add0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1ade0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
1adf0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
1ae00 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1ae10 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
1ae20 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
1ae30 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
1ae40 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
1ae50 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
1ae60 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
1ae70 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
1ae80 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
1ae90 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1aea0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1aeb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aec0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1aed0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
1aee0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
1aef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
1af00 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
1af10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1af20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1af30 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1af40 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
1af50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1af60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
1af70 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1af80 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
1af90 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
1afa0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
1afb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1afc0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
1afd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1afe0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
1aff0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
1b000 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
1b010 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
1b020 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
1b030 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
1b040 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
1b050 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
1b060 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
1b070 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
1b080 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
1b090 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1b0a0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
1b0b0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
1b0c0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
1b0d0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
1b0e0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
1b0f0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
1b100 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
1b110 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
1b120 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
1b130 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
1b140 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
1b150 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
1b160 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
1b170 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
1b180 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
1b190 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
1b1a0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
1b1b0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
1b1c0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
1b1d0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1b1e0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
1b1f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b200 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
1b210 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1b220 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1b230 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
1b240 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b250 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
1b260 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1b270 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
1b280 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
1b290 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
1b2a0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
1b2b0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
1b2c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1b2d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
1b2e0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
1b2f0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
1b300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b310 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1b320 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
1b330 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1b340 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
1b350 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
1b360 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1b370 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
1b380 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
1b390 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
1b3a0 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
1b3b0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1b3c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1b3d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
1b3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1b3f0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
1b400 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1b410 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b420 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
1b430 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
1b440 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
1b450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b460 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b480 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
1b490 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1b4a0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
1b4b0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
1b4c0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
1b4d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
1b4e0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
1b4f0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
1b500 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
1b510 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b520 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
1b530 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
1b540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1b550 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
1b560 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1b570 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
1b580 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
1b590 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
1b5a0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
1b5b0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
1b5c0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
1b5d0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
1b5e0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1b5f0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
1b600 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
1b610 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
1b620 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
1b630 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1b640 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1b650 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
1b660 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
1b670 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
1b680 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1b690 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1b6a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1b6b0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
1b6c0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
1b6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b6e0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
1b6f0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
1b700 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1b710 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1b720 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
1b730 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
1b740 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
1b750 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1b760 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
1b770 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1b780 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
1b790 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
1b7a0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
1b7b0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b7c0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1b7d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
1b7e0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
1b7f0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
1b800 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
1b810 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
1b820 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
1b830 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
1b840 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
1b850 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
1b860 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
1b870 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1b880 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
1b890 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
1b8a0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
1b8b0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
1b8c0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
1b8d0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
1b8e0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
1b8f0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
1b900 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
1b910 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
1b920 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
1b930 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
1b940 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
1b950 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
1b960 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
1b970 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
1b980 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
1b990 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
1b9a0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
1b9b0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
1b9c0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
1b9d0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
1b9e0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
1b9f0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
1ba00 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
1ba10 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
1ba20 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
1ba30 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
1ba40 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1ba50 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
1ba60 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
1ba70 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
1ba80 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
1ba90 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
1baa0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
1bab0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
1bac0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
1bad0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
1bae0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
1baf0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
1bb00 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
1bb10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bb20 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
1bb30 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
1bb40 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1bb50 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1bb60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bb70 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
1bb80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1bb90 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1bba0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1bbb0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1bbc0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1bbd0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1bbe0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1bbf0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1bc00 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1bc10 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1bc20 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1bc30 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1bc40 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1bc50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1bc60 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1bc70 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1bc80 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1bc90 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bca0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1bcb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bcc0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1bcd0 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1bce0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1bcf0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1bd00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1bd10 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1bd20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1bd30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1bd40 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bd50 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1bd60 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1bd70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bd80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1bd90 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bda0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1bdb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1bdc0 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1bdd0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1bde0 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1bdf0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1be00 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1be10 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1be20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1be30 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1be40 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1be50 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1be60 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1be70 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1be80 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1be90 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1bea0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1beb0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1bec0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1bed0 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1bee0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bef0 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1bf00 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1bf10 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1bf20 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1bf30 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1bf40 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1bf50 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1bf60 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1bf70 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1bf80 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1bf90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1bfa0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1bfb0 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1bfc0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1bfd0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1bfe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bff0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c000 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1c010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1c020 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1c030 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1c040 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c050 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1c060 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1c070 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1c080 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c090 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1c0a0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1c0b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1c0c0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1c0d0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1c0e0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1c0f0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1c100 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1c110 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1c120 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1c130 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1c140 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1c150 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1c160 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1c170 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1c180 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1c190 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1c1a0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1c1b0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1c1c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1c1d0 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1c1e0 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1c1f0 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1c200 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c210 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1c220 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1c230 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1c240 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1c250 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1c260 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1c270 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1c280 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1c290 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1c2a0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1c2b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1c2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1c2d0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1c2e0 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1c2f0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1c300 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1c310 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1c320 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1c330 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1c340 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1c350 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1c360 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1c370 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1c380 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1c390 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1c3a0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1c3b0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1c3c0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1c3d0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1c3e0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1c3f0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1c400 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1c410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c420 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1c430 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1c440 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1c450 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1c460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1c470 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1c480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1c490 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1c4a0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1c4b0 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1c4c0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1c4d0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1c4e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c4f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c500 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1c510 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1c520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c530 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1c550 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1c560 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1c570 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1c580 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1c590 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1c5a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1c5b0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1c5c0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1c5d0 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
1c5e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c5f0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1c600 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c610 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1c620 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1c630 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c640 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1c650 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1c660 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1c670 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1c680 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1c690 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1c6a0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1c6b0 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1c6c0 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1c6d0 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1c6e0 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1c6f0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1c700 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1c710 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1c720 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1c730 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1c740 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1c750 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1c760 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1c770 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1c780 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1c790 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1c7a0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1c7b0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1c7c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1c7d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1c7e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c7f0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1c800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c810 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1c820 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1c830 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1c840 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1c850 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1c860 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1c870 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1c880 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1c890 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1c8a0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1c8b0 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1c8c0 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1c8d0 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1c8e0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1c8f0 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1c900 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1c910 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1c920 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1c930 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1c940 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1c950 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1c960 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1c970 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1c980 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1c990 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1c9a0 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1c9b0 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1c9c0 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1c9d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1c9e0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1c9f0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1ca00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1ca10 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1ca20 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ca30 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1ca40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ca50 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1ca60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1ca70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ca90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1caa0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1cab0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1cac0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cad0 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1cae0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1caf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1cb00 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1cb10 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1cb20 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1cb30 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1cb40 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1cb50 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1cb60 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1cb70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1cb80 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1cb90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1cba0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1cbb0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1cbc0 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1cbd0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1cbe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cbf0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1cc00 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1cc10 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1cc20 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1cc30 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1cc40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1cc50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1cc60 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1cc70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1cc80 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1cc90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1cca0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1ccb0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1ccc0 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1ccd0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1cce0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1ccf0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1cd00 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1cd10 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1cd20 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1cd30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1cd40 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1cd50 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1cd60 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1cd70 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1cda0 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1cdb0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cde0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1cdf0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1ce00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1ce30 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1ce40 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1ce50 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1ce60 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1ce70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ce80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1ce90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cea0 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1ceb0 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1cec0 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1ced0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1cee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1cef0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c  turn rc;.  nCell
1cf00 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1cf10 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1cf20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1cf30 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1cf40 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1cf50 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1cf60 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1cf70 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1cf80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1cf90 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1cfa0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1cfb0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1cfc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1cfd0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1cfe0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1cff0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1d000 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d010 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1d020 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1d030 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d040 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d050 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1d060 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1d070 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1d080 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1d090 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1d0b0 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1d0c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1d0d0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1d0e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1d0f0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1d100 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1d110 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1d120 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1d130 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1d140 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1d150 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1d160 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1d170 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1d180 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1d190 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1d1a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1d1c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1d1d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1d1e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1d1f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d200 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d210 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1d240 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1d250 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1d260 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1d270 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1d280 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1d290 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1d2a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1d2b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1d2c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1d2d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1d2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d2f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1d300 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1d310 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1d320 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1d330 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1d340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d350 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1d360 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d370 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1d380 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1d390 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1d3a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1d3b0 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1d3c0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1d3d0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1d3e0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1d3f0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1d400 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1d410 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1d420 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1d430 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d440 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1d450 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
1d460 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1d470 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1d480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d490 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
1d4a0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ell;.    int rc;
1d4b0 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ..    rc = pPage
1d4c0 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1d4d0 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1d4e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1d4f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1d500 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1d510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1d520 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d530 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1d540 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1d550 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1d560 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1d570 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1d580 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1d590 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1d5a0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1d5b0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1d5c0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1d5d0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e        if( info.n
1d5e0 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c  Local<info.nPayl
1d5f0 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
1d600 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
1d610 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61  nSize > pPage->a
1d620 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d  Data+pPage->pBt-
1d630 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
1d640 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d650 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d660 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
1d670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d680 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
1d690 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  et4byte(pCell+in
1d6a0 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20  fo.nSize-4) ){. 
1d6b0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1d6c0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1d6d0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1d6e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d6f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d710 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1d720 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1d730 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d740 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1d750 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1d760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d780 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1d790 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1d7a0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1d7b0 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1d7c0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1d7d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1d7e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1d7f0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1d800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d810 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1d820 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1d830 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d840 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d850 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d860 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1d870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d880 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1d890 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1d8a0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d8b0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1d8c0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1d8d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1d8e0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1d8f0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1d900 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1d910 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1d920 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1d930 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1d940 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1d950 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1d960 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1d970 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1d980 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1d990 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1d9a0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1d9b0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1d9c0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1d9d0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1d9e0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1d9f0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1da00 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1da10 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1da20 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1da30 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1da40 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1da50 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1da60 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1da70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1da80 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1da90 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1daa0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1dab0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1dac0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1dad0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1dae0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1daf0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1db00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1db10 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1db20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1db30 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1db40 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1db50 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1db60 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1db70 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1db80 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1db90 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1dba0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1dbb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1dbc0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1dbd0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1dbe0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1dbf0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1dc00 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1dc10 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1dc20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1dc30 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1dc40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1dc50 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1dc60 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1dc70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1dc80 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1dc90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dca0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1dcb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1dcc0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1dcd0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1dce0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1dcf0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1dd00 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1dd10 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1dd20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1dd30 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1dd40 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1dd50 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1dd60 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1dd70 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1dd80 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1dd90 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1dda0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1ddb0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1ddc0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1ddd0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1dde0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1ddf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1de10 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1de20 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1de30 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1de40 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1de50 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1de60 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1de70 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1de80 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1de90 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1dea0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1deb0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1dec0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1ded0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1dee0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1def0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1df00 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1df10 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1df20 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1df30 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1df40 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1df50 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1df60 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1df70 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1df80 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1df90 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1dfa0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1dfb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1dfc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1dfd0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1dfe0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1dff0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e000 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e010 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e040 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e060 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e070 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e080 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e090 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e0a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e0b0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e0c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e0d0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e0e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e0f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e120 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e130 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e140 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e150 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e160 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e170 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e180 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e190 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e1a0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e1b0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e1c0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e1d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e1e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e1f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e200 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e210 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e230 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e250 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e260 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e270 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e290 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e2a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e2b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e2c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e2d0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e2e0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e2f0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e300 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e310 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e340 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e350 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e360 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e390 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e3a0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e3b0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1e3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e3d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1e3e0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1e3f0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1e400 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1e410 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1e420 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1e430 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1e440 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1e450 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1e460 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1e470 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1e480 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1e490 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1e4a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1e4b0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1e4c0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1e4d0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1e4e0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1e4f0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1e500 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1e510 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1e520 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1e530 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1e540 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1e550 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1e560 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1e570 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1e580 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1e590 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1e5a0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1e5b0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1e5c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1e5d0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1e5e0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1e5f0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1e600 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1e610 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1e620 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1e630 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1e640 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1e650 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1e660 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1e670 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1e680 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1e690 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1e6a0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1e6b0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1e6c0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1e6d0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1e6e0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1e6f0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1e700 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1e710 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1e720 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1e730 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1e740 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1e750 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1e760 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1e770 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1e780 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1e790 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1e7a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e7b0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1e7c0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1e7d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1e7e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e7f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e810 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1e820 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1e830 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e840 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1e850 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1e860 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e870 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1e880 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1e890 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1e8a0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e8b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e8c0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1e8d0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1e8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8f0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1e900 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e910 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1e920 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1e930 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e960 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1e970 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e980 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e9a0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e9b0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e9c0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1e9d0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1e9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1e9f0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1ea00 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1ea10 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1ea20 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ea30 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1ea40 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1ea50 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1ea60 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1ea70 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1ea80 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1ea90 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1eaa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1eab0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1eac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1ead0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1eae0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1eaf0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1eb00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1eb10 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1eb20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1eb30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1eb40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1eb50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1eb60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1eb70 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1eb80 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1eb90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1eba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ebb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ebc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1ebd0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1ebe0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1ebf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1ec00 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1ec10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1ec20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec40 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1ec50 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1ec60 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1ec70 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1ec80 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1ec90 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1eca0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1ecb0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1ecc0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1ecd0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1ece0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1ecf0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1ed00 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1ed10 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1ed20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1ed30 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1ed40 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1ed50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ed60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ed80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1ed90 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1eda0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1edb0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1edc0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1edd0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1ede0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1edf0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1ee00 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1ee10 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1ee20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1ee30 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1ee40 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1ee50 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1ee60 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1ee70 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1ee80 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1ee90 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1eea0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1eeb0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1eec0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1eed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1eee0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1eef0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1ef00 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1ef10 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1ef20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1ef30 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1ef40 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1ef50 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1ef60 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1ef70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1ef80 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1ef90 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1efa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1efb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1efc0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1efd0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1efe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1eff0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f000 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f010 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f020 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f030 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f040 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f050 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f060 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f070 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f080 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f090 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f0a0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f0c0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f0d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f0e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f0f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f100 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f110 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f120 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f130 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f140 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f150 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f160 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f170 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f180 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f190 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f1a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f1b0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f1e0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f1f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f200 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f210 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f220 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f230 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f240 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f250 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f260 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f270 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f280 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f290 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f2a0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f2b0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f2c0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f2d0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f2e0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f2f0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f320 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f330 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f340 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f360 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f370 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f380 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f390 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f3b0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1f3c0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1f3d0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1f3e0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1f3f0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1f400 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1f410 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1f420 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1f430 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1f440 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1f450 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f460 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1f470 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f480 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1f490 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1f4a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f4b0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1f4c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f4d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1f4e0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1f4f0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1f500 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1f510 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1f520 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1f530 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1f540 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1f550 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1f560 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1f570 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1f580 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1f590 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1f5a0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1f5b0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1f5c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1f5d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1f5e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1f5f0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1f600 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1f610 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1f620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f630 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1f640 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f650 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1f660 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1f670 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1f680 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1f690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f6a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1f6b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1f6c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1f6d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f6e0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1f6f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f700 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1f710 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f730 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1f740 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1f750 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f760 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1f770 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1f780 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f790 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1f7a0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1f7b0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1f7c0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1f7d0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1f7e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f7f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1f810 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1f820 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1f830 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1f840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f860 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f870 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1f880 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1f890 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1f8a0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1f8b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f8e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f8f0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f900 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f910 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f920 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f930 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f940 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f960 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f970 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1f980 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f9a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f9b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1f9c0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1f9d0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1f9e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1f9f0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1fa00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1fa10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1fa20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1fa30 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1fa40 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1fa50 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1fa60 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1fa70 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1fa80 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1fa90 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1faa0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1fab0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1fac0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1fad0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1fae0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1faf0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1fb00 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1fb10 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1fb20 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1fb30 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1fb40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1fb50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1fb60 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1fb70 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1fb80 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1fb90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1fba0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1fbb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fbc0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1fbd0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1fbe0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1fbf0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1fc00 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1fc10 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1fc20 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1fc30 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1fc40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fc50 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1fc60 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1fc70 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1fc80 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1fc90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1fca0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1fcb0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1fcc0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1fce0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1fcf0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1fd00 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1fd10 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1fd20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1fd30 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1fd40 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1fd50 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1fd60 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1fd70 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1fd80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fd90 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1fda0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1fdb0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1fdc0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1fdd0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1fde0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1fdf0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1fe00 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1fe10 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1fe20 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1fe30 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1fe40 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1fe50 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1fe60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1fe70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fe80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1fe90 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1fea0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1feb0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1fec0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1fed0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1fee0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1fef0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1ff00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ff10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ff20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1ff30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1ff40 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1ff50 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1ff60 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1ff70 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1ff80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1ff90 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1ffa0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1ffb0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1ffc0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1ffd0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1ffe0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1fff0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20000 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20020 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20030 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20040 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20050 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20060 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
20070 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20080 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
20090 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
200a0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
200b0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
200c0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
200d0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
200e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
200f0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20120 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20130 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20140 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20150 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
20160 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20170 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
20180 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
20190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
201a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
201b0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
201c0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
201d0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
201e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
201f0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20200 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
20210 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20220 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20230 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20240 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20250 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
20260 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
20270 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
20280 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
20290 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
202a0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
202b0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
202c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
202d0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
202e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
202f0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
20300 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
20310 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20320 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20330 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20340 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20350 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
20360 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
20370 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
20380 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
20390 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
203a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
203c0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
203d0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
203e0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
203f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20400 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
20410 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20420 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20430 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20440 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20450 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
20460 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
20470 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
20480 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20490 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
204a0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
204b0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
204c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
204d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
204e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
204f0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20500 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20510 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20520 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20530 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20540 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20550 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
20560 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
20570 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20580 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
20590 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
205a0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
205b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
205c0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
205d0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
205e0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
205f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20600 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20610 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20620 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20630 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20640 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20650 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
20660 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20670 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
20680 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
20690 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
206a0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
206b0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
206c0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
206d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
206e0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
206f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20700 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20710 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20730 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20740 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20750 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20760 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20770 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20780 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20790 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
207a0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
207b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
207c0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
207d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
207e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
207f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20800 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20810 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20820 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20830 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20850 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20870 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20880 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20890 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
208a0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
208b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
208c0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
208d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
208e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
208f0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20900 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20910 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20920 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20930 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20940 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20950 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20960 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20970 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20980 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20990 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
209a0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
209b0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
209c0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
209d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
209e0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
209f0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
20a00 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
20a10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20a20 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
20a30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20a40 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20a50 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20a60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20a70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20a80 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
20a90 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
20aa0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20ab0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
20ac0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
20ad0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
20ae0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
20af0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
20b00 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
20b10 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
20b20 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
20b30 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20b40 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20b50 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20b60 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20b70 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
20b80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20b90 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
20ba0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
20bb0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
20bc0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
20bd0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
20bf0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
20c00 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
20c10 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
20c20 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
20c30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20c40 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20c50 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20c60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20c70 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
20c80 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
20c90 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
20ca0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
20cb0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
20cc0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
20cd0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
20ce0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
20cf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
20d00 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
20d10 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
20d20 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
20d30 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
20d40 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
20d50 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
20d60 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
20d70 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
20d80 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
20d90 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
20da0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20db0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
20dc0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
20dd0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
20de0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
20df0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
20e00 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
20e10 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
20e20 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
20e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
20e40 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
20e50 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20e60 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20e70 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
20e80 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
20e90 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
20ea0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
20eb0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
20ec0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20ed0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20ee0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
20ef0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
20f00 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
20f10 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
20f20 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20f30 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
20f40 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20f50 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
20f60 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
20f70 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
20f80 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
20f90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20fa0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
20fb0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
20fc0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
20fd0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
20fe0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
20ff0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
21000 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
21010 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21020 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21030 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21040 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21050 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
21060 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
21070 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
21080 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
21090 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
210a0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
210b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
210c0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
210d0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
210e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
210f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21100 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
21110 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21120 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21130 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21140 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21150 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21160 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
21170 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
21180 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
21190 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
211a0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
211b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
211c0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
211d0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
211e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
211f0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
21200 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
21210 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21220 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21230 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21240 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21250 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
21260 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21270 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
21280 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
21290 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
212a0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
212b0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
212c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
212d0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
212e0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
212f0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
21300 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
21310 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21320 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21330 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21340 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21350 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
21360 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
21370 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
21380 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
21390 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
213a0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
213b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
213c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
213d0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
213e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
213f0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
21400 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
21410 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21420 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21430 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21440 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21450 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
21460 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
21470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21480 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
21490 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
214a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
214b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
214c0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
214d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
214e0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
214f0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21500 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21510 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21520 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21530 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21540 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21550 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21560 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
21570 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21580 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21590 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
215a0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
215b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
215c0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
215d0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
215e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
215f0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21600 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21620 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21630 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21640 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21660 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
21670 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
21680 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
21690 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
216a0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
216b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
216c0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
216d0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
216e0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
216f0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21700 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21710 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21720 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21730 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21740 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21750 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21760 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21770 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21780 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21790 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
217a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
217b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
217c0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
217d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
217e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
217f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21800 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21810 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21820 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21850 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21860 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21870 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21880 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21890 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
218a0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
218b0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
218c0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
218d0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
218e0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
218f0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21900 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21910 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21920 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21930 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21940 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21950 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21960 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21970 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21980 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21990 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
219a0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
219b0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
219c0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
219d0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
219e0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
219f0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
21a00 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
21a10 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
21a20 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
21a30 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21a40 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21a50 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21a60 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21a70 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
21a80 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
21a90 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
21aa0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
21ab0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
21ac0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
21ad0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
21ae0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
21af0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
21b00 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
21b10 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
21b20 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
21b30 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21b40 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21b50 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21b60 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21b70 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
21b80 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
21b90 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
21ba0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
21bb0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
21bc0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
21bd0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
21be0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
21bf0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21c00 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
21c10 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
21c20 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
21c30 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21c40 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21c50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21c60 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21c70 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
21c80 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
21c90 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
21ca0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21cb0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
21cc0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
21cd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21ce0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
21cf0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
21d00 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
21d10 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
21d20 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
21d30 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
21d40 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
21d50 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21d60 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
21d70 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
21d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
21d90 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
21da0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
21db0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
21dc0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
21dd0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
21de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21df0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
21e00 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
21e10 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
21e20 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
21e30 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21e40 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21e50 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21e70 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
21e80 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
21e90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21ea0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
21eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
21ec0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
21ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
21f00 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
21f10 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
21f20 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
21f30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21f40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21f70 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
21f80 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
21f90 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
21fa0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
21fb0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
21fc0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
21fd0 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
21fe0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
21ff0 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
22000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22010 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22030 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22040 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22050 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
22060 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
22070 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
22080 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
22090 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
220a0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
220b0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
220c0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
220d0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
220e0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
220f0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
22100 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22110 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22120 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22130 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22140 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22150 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
22160 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
22170 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
22180 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22190 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
221a0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
221b0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
221c0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
221d0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
221e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
221f0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
22200 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
22210 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22220 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22230 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22240 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22250 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
22260 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
22270 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
22280 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
22290 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
222a0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
222b0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
222c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
222d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
222e0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
222f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22300 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
22310 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22320 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22330 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22340 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22360 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
22370 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
22380 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
22390 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
223a0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
223b0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
223c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
223d0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
223e0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
223f0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
22400 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22410 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22420 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22430 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22440 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22450 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
22460 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
22470 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
22480 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22490 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
224a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
224b0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
224c0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
224d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
224e0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
224f0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22500 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22510 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22520 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22530 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22540 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22550 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
22560 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
22570 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
22580 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
22590 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
225a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
225b0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
225c0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
225d0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
225e0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
225f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22600 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22610 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22620 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22630 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22640 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22650 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
22660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22670 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
22680 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
22690 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
226a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
226b0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
226c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
226d0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
226e0 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
226f0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22700 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22710 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22720 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22730 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22740 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22750 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22760 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22780 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22790 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
227a0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
227b0 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
227c0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
227d0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
227e0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
227f0 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22800 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22810 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22820 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22830 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22840 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22850 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22860 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22870 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22880 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22890 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
228a0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
228b0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
228c0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
228d0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
228e0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
228f0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22900 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22910 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22920 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22930 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22940 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22950 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22960 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22970 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22980 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22990 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
229a0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
229b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
229c0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
229d0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
229e0 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
229f0 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
22a00 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
22a10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22a20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
22a30 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
22a40 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
22a50 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
22a60 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
22a70 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
22a80 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
22a90 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
22aa0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
22ab0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
22ac0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
22ad0 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
22ae0 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
22af0 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
22b00 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
22b10 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
22b20 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
22b30 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
22b40 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
22b50 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
22b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
22b70 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
22b80 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
22b90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
22ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22bb0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
22bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22bd0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
22be0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
22bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
22c00 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
22c10 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
22c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
22c30 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
22c40 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
22c50 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
22c60 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
22c70 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
22c80 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
22c90 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
22ca0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
22cb0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
22cc0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
22cd0 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
22ce0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
22cf0 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
22d00 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
22d10 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
22d20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
22d30 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
22d40 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
22d50 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
22d60 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
22d70 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
22d80 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
22d90 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
22da0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
22db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22dc0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
22dd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
22de0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
22df0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22e00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
22e20 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
22e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
22e40 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
22e50 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
22e60 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
22e70 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
22e80 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
22e90 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
22ea0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
22eb0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
22ec0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
22ed0 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
22ee0 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
22ef0 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
22f00 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
22f10 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
22f20 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
22f30 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
22f40 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
22f50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
22f60 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
22f70 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
22f80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
22f90 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
22fa0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
22fb0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
22fc0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
22fd0 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
22fe0 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
22ff0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
23000 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
23010 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23020 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23030 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23050 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
23060 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
23070 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
23080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23090 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
230a0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
230b0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
230c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
230d0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
230e0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
230f0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
23100 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23110 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23120 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23130 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23140 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23150 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
23160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23170 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
23180 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
23190 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
231a0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
231b0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
231c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
231d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
231e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
231f0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
23200 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23210 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23220 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23240 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23250 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
23260 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
23270 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
23280 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23290 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
232a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
232b0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
232c0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
232d0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
232e0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
232f0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
23300 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23310 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23320 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23330 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23340 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23350 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23360 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
23370 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
23380 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
23390 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
233a0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
233b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
233c0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
233d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
233e0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
233f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23400 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
23410 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23420 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23430 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23440 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23450 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
23460 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
23470 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
23480 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
23490 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
234a0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
234b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
234c0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
234d0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
234e0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
234f0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23500 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23510 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23520 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23530 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23540 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23550 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
23560 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
23570 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
23580 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
23590 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
235a0 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
235b0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
235c0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
235d0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
235e0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
235f0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23600 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23610 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23620 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23630 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23640 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23650 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
23660 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
23670 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
23680 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
23690 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
236a0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
236b0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
236c0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
236d0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
236e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
236f0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23700 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23710 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23720 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23730 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23740 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23750 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23760 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23770 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23780 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23790 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
237a0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
237b0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
237c0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
237d0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
237e0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
237f0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23800 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23810 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23820 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23830 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23840 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23850 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23860 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23880 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23890 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
238a0 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
238b0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
238c0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
238d0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
238e0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
238f0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23900 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23910 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23920 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23930 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23940 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23950 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23960 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23970 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23980 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23990 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
239a0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
239b0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
239c0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
239d0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
239e0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
239f0 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
23a00 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
23a10 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
23a20 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
23a30 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
23a40 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
23a50 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
23a60 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
23a70 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
23a80 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
23a90 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
23aa0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
23ab0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
23ac0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
23ad0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
23ae0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
23af0 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
23b00 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
23b10 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
23b20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
23b30 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
23b40 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
23b50 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
23b60 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
23b70 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
23b80 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
23b90 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
23ba0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
23bb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
23bc0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
23bd0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
23be0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
23bf0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
23c00 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
23c10 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
23c20 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
23c30 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
23c40 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
23c50 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c80 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
23c90 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
23cc0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
23cd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
23ce0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d00 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
23d10 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
23d20 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
23d30 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23d40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
23d50 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
23d60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
23d70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23da0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
23db0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
23dc0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23de0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
23df0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
23e00 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
23e30 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
23e40 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
23e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
23e60 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
23e70 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
23e80 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
23e90 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
23ea0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
23eb0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
23ec0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
23ed0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
23ee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
23ef0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
23f00 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
23f10 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
23f20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
23f30 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
23f40 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
23f50 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
23f60 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
23f70 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
23f80 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
23f90 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
23fa0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
23fb0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
23fc0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
23fd0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
23fe0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
23ff0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24000 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
24010 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24020 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24030 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24040 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24050 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24060 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
24070 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
24080 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
24090 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
240a0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
240b0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
240c0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
240d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
240e0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
240f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
24100 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24110 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24120 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24130 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24140 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24150 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
24160 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
24170 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
24180 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
24190 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
241a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
241b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
241c0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
241d0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
241e0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
241f0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
24200 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
24210 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24220 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24230 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24240 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24250 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
24260 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
24270 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
24280 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
24290 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
242a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
242b0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
242c0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
242d0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
242e0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
242f0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
24300 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
24310 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24320 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24330 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24340 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24350 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
24360 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
24370 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
24380 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
24390 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
243a0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
243b0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
243c0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
243d0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
243e0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
243f0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
24400 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
24410 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24420 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24430 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24440 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24450 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
24460 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
24470 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
24480 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24490 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
244a0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
244b0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
244c0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
244d0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
244e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
244f0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24520 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24530 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24560 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
245a0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
245b0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
245c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
245f0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24600 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24610 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24630 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24640 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24650 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24680 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
24690 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
246a0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
246b0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
246c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
246d0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
246e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
246f0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24700 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24710 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24720 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24740 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24760 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24770 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24780 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24790 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
247a0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
247b0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
247c0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
247d0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
247e0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
247f0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24800 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24810 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24820 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24830 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24840 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24850 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24860 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24870 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24880 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24890 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
248a0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
248b0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
248c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
248d0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
248e0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
248f0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24900 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24910 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24920 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24930 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24940 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24950 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24960 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24970 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24980 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24990 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
249a0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
249b0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
249c0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
249d0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
249e0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
249f0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
24a00 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
24a10 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
24a20 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
24a30 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
24a40 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
24a50 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
24a60 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
24a70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
24a80 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
24a90 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
24aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24ab0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
24ac0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
24ad0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
24ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24af0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
24b00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24b10 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
24b20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
24b30 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
24b40 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
24b50 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
24b60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24b70 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
24b80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
24b90 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
24ba0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
24bb0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
24bc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
24bd0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
24be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
24bf0 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
24c00 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
24c10 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
24c20 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
24c30 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
24c40 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
24c50 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
24c60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24c70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c80 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
24c90 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
24ca0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
24cb0 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
24cc0 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
24cd0 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
24ce0 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
24cf0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
24d00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24d10 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
24d20 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
24d30 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
24d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24d50 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
24d60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24d70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24d80 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24d90 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
24da0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
24db0 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
24dc0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
24dd0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
24de0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
24df0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
24e00 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
24e10 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
24e20 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
24e30 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
24e40 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
24e50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
24e60 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
24e70 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
24e80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
24e90 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
24ea0 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
24eb0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
24ec0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
24ed0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
24ee0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
24ef0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
24f00 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
24f10 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
24f20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
24f30 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
24f40 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29  pCur->ix, &info)
24f50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
24f60 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63  RRUPT_DB || memc
24f70 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
24f80 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
24f90 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
24fa0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
24fb0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
24fc0 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53  .#endif.static S
24fd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
24fe0 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
24ff0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25000 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
25010 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
25020 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
25030 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
25040 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ey;.    btreePar
25050 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
25060 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75  ge,pCur->ix,&pCu
25070 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
25080 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
25090 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
250a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
250b0 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
250c0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
250d0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
250e0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
250f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
25100 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
25110 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
25120 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
25130 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
25140 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
25150 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
25160 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
25170 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
25180 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
25190 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
251a0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
251b0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
251c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
251d0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
251e0 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
251f0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
25200 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
25210 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25220 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
25230 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  EBUG */.int sqli
25240 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
25250 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72  ValidNN(BtCursor
25260 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
25270 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
25280 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
25290 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
252a0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
252b0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
252c0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
252d0 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61  or "rowid" for a
252e0 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a   table btree..**
252f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25300 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
25310 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
25320 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61   pointing into a
25330 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62  .** ordinary tab
25340 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  le btree.  If th
25350 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
25360 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  to an index btre
25370 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c  e or.** is inval
25380 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f  id, the result o
25390 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
253a0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
253b0 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
253c0 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72  IntegerKey(BtCur
253d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
253e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
253f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25400 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25410 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25420 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
25430 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
25440 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  y );.  getCellIn
25450 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
25460 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  rn pCur->info.nK
25470 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ey;.}..#ifdef SQ
25480 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
25490 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a  ET_SQL_FUNC./*.*
254a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
254b0 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  set into the dat
254c0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
254d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
254e0 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68  ** payload to wh
254f0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
25500 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69  s pointing..*/.i
25510 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  64 sqlite3BtreeO
25520 66 66 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a  ffset(BtCursor *
25530 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
25540 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25550 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25560 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25570 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25580 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
25590 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
255a0 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d   (i64)pCur->pBt-
255b0 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29  >pageSize*((i64)
255c0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e  pCur->pPage->pgn
255d0 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20  o - 1) +.       
255e0 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e    (i64)(pCur->in
255f0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
25600 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61  ur->pPage->aData
25610 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
25620 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
25630 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a  SET_SQL_FUNC */.
25640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25650 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
25660 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72  s of payload for
25670 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
25680 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65  pCur is.** curre
25690 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
256a0 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72  .  For table btr
256b0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
256c0 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  e the amount.** 
256d0 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e  of data.  For in
256e0 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73  dex btrees, this
256f0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
25700 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  e of the key..**
25710 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
25720 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
25730 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
25740 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
25750 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
25760 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
25770 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
25780 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
25790 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
257a0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
257b0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
257c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
257d0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
257e0 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
257f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25800 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
25810 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25820 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25830 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25840 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25850 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
25860 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
25870 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
25880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
25890 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
258a0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
258b0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
258c0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
258d0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
258e0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
258f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25900 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
25910 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
25920 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
25930 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
25940 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
25950 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25960 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
25970 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
25980 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
25990 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
259a0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
259b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
259c0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
259d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
259e0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
259f0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
25a00 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
25a10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
25a20 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25a30 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
25a40 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
25a50 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
25a60 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
25a70 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
25a80 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
25a90 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
25aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
25ab0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
25ac0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
25ad0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
25ae0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
25af0 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
25b00 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
25b10 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
25b20 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
25b30 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
25b40 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
25b50 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
25b60 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
25b70 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
25b80 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
25b90 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
25ba0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
25bb0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
25bc0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
25bd0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
25be0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
25bf0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
25c00 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
25c10 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
25c20 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
25c30 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
25c40 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
25c50 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
25c60 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
25c70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
25c80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
25c90 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
25ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25cb0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
25cc0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
25cd0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
25ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25cf0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
25d00 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
25d10 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
25d20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
25d30 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
25d40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
25d50 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
25d60 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
25d70 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
25d80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25d90 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25da0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25db0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
25dd0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
25de0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25df0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
25e00 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
25e10 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
25e20 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
25e30 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
25e40 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
25e50 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
25e60 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
25e70 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
25e80 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
25e90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
25ea0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
25eb0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
25ec0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
25ed0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
25ee0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
25ef0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
25f00 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
25f10 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
25f20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
25f30 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
25f40 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
25f50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
25f60 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
25f70 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
25f80 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
25f90 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
25fa0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
25fb0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
25fc0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
25fd0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
25fe0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
25ff0 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
26000 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
26010 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
26020 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
26030 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
26040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26050 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
26060 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
26070 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
26080 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
26090 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
260a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
260b0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
260c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
260d0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
260e0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
260f0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
26100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26110 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
26120 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
26130 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
26140 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26150 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
26160 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
26170 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
26180 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
26190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
261a0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
261b0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
261c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
261d0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
261e0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
261f0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
26200 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
26210 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
26220 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
26230 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
26240 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
26250 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
26260 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
26270 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
26280 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
26290 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
262a0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
262b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
262c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
262d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
262e0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
262f0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
26300 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
26310 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
26320 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
26330 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
26340 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
26350 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
26360 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
26370 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
26380 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
26390 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
263a0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
263b0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
263c0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
263d0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
263e0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
263f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26400 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
26410 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
26420 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26430 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
26440 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
26450 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
26460 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
26470 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
26480 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
26490 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
264a0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
264b0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
264c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
264d0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
264e0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
26510 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
26520 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
26530 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
26540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26550 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
26560 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
26570 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
26580 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
26590 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
265a0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
265b0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
265c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
265d0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
265e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
265f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
26600 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26610 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
26620 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
26630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
26640 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
26650 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
26660 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
26670 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
26680 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
26690 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
266a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
266b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
266c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
266d0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
266e0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
266f0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
26700 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
26710 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
26720 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
26730 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
26740 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
26750 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
26760 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
26770 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
26780 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
26790 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
267a0 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
267b0 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
267c0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
267d0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
267e0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
267f0 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
26800 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
26810 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
26820 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
26830 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
26840 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
26850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
26860 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
26870 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
26880 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
26890 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
268a0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
268b0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
268c0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
268d0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
268e0 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
268f0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
26900 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74  rflow pages.** t
26910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
26920 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
26930 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
26940 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f  opulate.** the o
26950 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26960 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
26970 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
26980 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
26990 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
269a0 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
269b0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
269c0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
269d0 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
269e0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
269f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26a00 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
26a10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
26a20 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
26a30 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
26a40 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
26a50 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
26a60 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
26a70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
26a80 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
26a90 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
26aa0 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
26ab0 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
26ac0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
26ad0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
26ae0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
26af0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
26b00 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
26b10 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
26b20 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
26b30 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
26b40 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
26b50 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
26b60 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
26b70 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
26b80 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
26b90 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
26ba0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
26bb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
26bc0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
26bd0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
26be0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
26bf0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
26c00 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
26c10 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
26c20 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
26c30 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
26c40 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
26c50 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
26c60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
26c70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
26c80 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
26c90 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
26ca0 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
26cb0 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
26cc0 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
26cd0 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
26ce0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
26cf0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
26d00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26d10 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
26d20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26d30 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20  = pCur->pPage;  
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d50 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
26d60 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
26d70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26d80 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26da0 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
26db0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
26dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
26dd0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
26de0 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
26df0 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
26e00 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20  tart = pBuf;    
26e10 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69   /* Start of ori
26e20 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72  ginal out buffer
26e30 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
26e40 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
26e50 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20   assert( eOp==0 
26e60 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61  || eOp==1 );.  a
26e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26e80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26e90 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
26ea0 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
26eb0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
26ec0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26ed0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
26ee0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
26ef0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
26f00 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
26f10 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  ad;.  assert( of
26f20 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
26f30 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
26f40 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50  );..  assert( aP
26f50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e  ayload > pPage->
26f60 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28  aData );.  if( (
26f70 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d  uptr)(aPayload -
26f80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e   pPage->aData) >
26f90 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
26fa0 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e - pCur->info.n
26fb0 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
26fc0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
26fd0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
26fe0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
26ff0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  a is an error.  
27000 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  The.    ** condi
27010 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20  tional above is 
27020 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20  really:.    **  
27030 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72    &aPayload[pCur
27040 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
27050 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
27060 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
27070 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65      ** but is re
27080 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75  cast into its cu
27090 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76  rrent form to av
270a0 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72  oid integer over
270b0 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20  flow problems.  
270c0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
270d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
270e0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
270f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
27100 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
27110 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
27120 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
27130 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
27140 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
27150 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
27160 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
27170 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
27180 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27190 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
271a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
271b0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
271c0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
271d0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
271e0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
271f0 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
27200 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
27210 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
27220 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
27230 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
27240 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
27250 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
27260 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }...  if( rc==SQ
27270 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27280 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
27290 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
272a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
272b0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
272c0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
272d0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
272e0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
272f0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
27300 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
27310 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
27320 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
27330 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
27340 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
27350 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
27360 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
27370 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
27380 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
27390 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
273a0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
273b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
273c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
273d0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
273e0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
273f0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
27400 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
27410 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
27420 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
27430 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
27440 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
27450 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
27460 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
27470 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
27480 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
27490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
274a0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
274b0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
274c0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
274d0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
274e0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
274f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27500 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
27510 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
27520 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
27530 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
27540 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
27550 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
27560 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
27570 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
27580 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
27590 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
275a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
275b0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
275c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
275d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
275e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
275f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
27600 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
27610 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
27620 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
27630 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
27640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
27650 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
27660 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
27670 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
27680 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
27690 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
276a0 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
276b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
276c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
276d0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
276e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
276f0 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
27700 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
27710 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
27720 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
27730 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
27740 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
27750 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27760 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27770 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
27780 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
27790 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
277a0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
277b0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
277c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
277d0 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
277e0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
277f0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
27800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
27810 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27820 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
27830 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
27840 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
27850 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
27860 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
27870 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27880 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
27890 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
278a0 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
278b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
278c0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
278d0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
278e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
278f0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
27900 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
27910 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
27920 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
27930 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
27940 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27950 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
27960 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
27970 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
27980 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27990 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
279a0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
279b0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
279c0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
279d0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
279e0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
279f0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
27a00 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
27a10 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
27a20 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
27a30 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
27a40 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
27a50 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
27a60 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
27a70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27a80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27a90 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27aa0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
27ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27ac0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
27ad0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
27ae0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
27af0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
27b00 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
27b10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
27b20 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
27b30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27b40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
27b50 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
27b60 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
27b70 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
27b80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
27b90 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
27ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27bb0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
27bc0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
27bd0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
27be0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
27bf0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
27c00 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
27c10 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
27c20 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
27c30 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
27c40 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
27c50 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
27c60 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
27c70 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
27c80 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c  *fd;      /* Fil
27c90 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
27ca0 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c  do direct overfl
27cb0 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  ow read */.#endi
27cc0 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
27cd0 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
27ce0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
27cf0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
27d00 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
27d10 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
27d20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
27d30 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
27d40 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
27d50 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
27d60 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
27d70 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
27d80 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
27d90 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
27da0 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
27db0 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
27dc0 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
27dd0 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
27de0 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
27df0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
27e00 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20    **   3) there 
27e10 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
27e20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
27e30 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
27e40 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
27e50 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
27e60 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
27e70 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
27e80 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
27e90 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
27ea0 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
27eb0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
27ec0 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
27ed0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
27ee0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
27ef0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
27f00 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
27f10 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
27f20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27f30 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
27f40 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
27f50 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
27f60 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
27f70 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
27f80 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
27f90 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
27fa0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
27fb0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
27fc0 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
27fd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
27fe0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28010 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
28020 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28050 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
28060 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
28070 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
28080 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280a0 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
280b0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
280c0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
280d0 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
280e0 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34  ethods     /* (4
280f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
28100 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
28110 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  UseWal(pBt->pPag
28120 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
28130 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
28140 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
28150 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
28160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28180 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
28190 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
281a0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
281b0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
281c0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
281d0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
281e0 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
281f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
28210 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
28220 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
28230 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
28240 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28250 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
28260 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
28270 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
28280 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
28290 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
282a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
282b0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
282c0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
282d0 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
282e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
282f0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
28300 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
28310 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
28320 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28330 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
28340 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
28350 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
28360 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
28370 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
28380 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
28390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
283a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
283b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
283c0 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
283d0 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
283e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
283f0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
28400 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
28410 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28420 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
28430 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
28440 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
28450 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
28460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
28470 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
28480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
28490 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
284a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
284b0 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
284c0 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
284d0 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
284e0 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
284f0 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
28500 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
28510 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
28520 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
28530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28540 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
28550 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
28560 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
28570 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
28580 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28590 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
285a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
285b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
285c0 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
285d0 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
285e0 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
285f0 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
28600 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
28610 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
28620 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
28630 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
28640 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
28650 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
28660 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
28670 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
28680 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
28690 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
286a0 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
286b0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
286c0 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
286d0 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
286e0 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
286f0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
28700 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
28710 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
28720 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
28730 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
28740 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
28750 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
28760 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
28770 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
28780 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
28790 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
287a0 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
287b0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
287c0 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
287d0 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
287e0 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
287f0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
28800 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
28810 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
28820 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
28830 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
28840 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
28850 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
28860 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
28870 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
28880 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
28890 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
288a0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
288b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
288c0 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
288d0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
288e0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
288f0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
28900 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28910 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28920 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28930 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28940 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28950 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28960 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
28970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28980 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
28990 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
289a0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
289b0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
289c0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
289d0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
289e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
289f0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
28a00 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
28a10 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
28a20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
28a30 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
28a40 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
28a50 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
28a60 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
28a70 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
28a80 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
28a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
28aa0 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
28ab0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
28ac0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
28ad0 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
28ae0 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
28af0 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
28b00 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
28b10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28b20 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
28b30 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28b50 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28b60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28b70 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28b80 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
28b90 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28ba0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28bb0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
28bc0 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
28bd0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28be0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
28bf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28c00 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
28c10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28c20 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28c30 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28c40 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28c50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28c60 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28c70 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28c80 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
28c90 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28ca0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28cb0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
28cc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28cd0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
28ce0 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
28cf0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28d00 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
28d10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28d20 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
28d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
28d40 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
28d50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28d60 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
28d70 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
28d80 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28d90 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
28da0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
28db0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
28dc0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
28dd0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
28de0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
28df0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
28e00 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
28e10 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
28e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28e30 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28e40 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28e50 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28e60 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28e70 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28e80 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28e90 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28ea0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
28ec0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
28ed0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
28ee0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
28ef0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
28f00 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
28f10 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
28f20 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
28f30 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
28f40 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
28f50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28f60 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
28f70 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
28f80 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
28f90 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
28fa0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
28fb0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
28fc0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
28fd0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
28fe0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
28ff0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
29000 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
29010 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
29020 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
29030 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
29040 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
29050 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
29060 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
29070 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
29080 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
29090 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
290a0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
290b0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
290c0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
290d0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
290e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
290f0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
29100 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
29110 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
29120 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
29130 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
29140 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
29150 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
29160 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
29170 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
29180 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
29190 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
291a0 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65   int amt;.  asse
291b0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
291c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
291d0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
291e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
291f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29200 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
29210 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29220 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29230 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29240 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29250 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29260 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29270 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
29280 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
29290 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
292a0 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
292b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
292c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
292d0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
292e0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
292f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29300 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
29310 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
29320 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
29330 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72  B);.  amt = pCur
29340 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
29350 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70   if( amt>(int)(p
29360 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
29370 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
29380 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20  o.pPayload) ){. 
29390 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74     /* There is t
293a0 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20  oo little space 
293b0 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20  on the page for 
293c0 74 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f  the expected amo
293d0 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f  unt.    ** of lo
293e0 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74  cal content. Dat
293f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29400 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73  rrupt. */.    as
29410 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
29420 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41   );.    amt = MA
29430 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d  X(0, (int)(pCur-
29440 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
29450 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
29460 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20  ayload));.  }.  
29470 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74  *pAmt = (u32)amt
29480 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
29490 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
294a0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
294b0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
294c0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
294d0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
294e0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
294f0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
29500 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
29510 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
29520 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
29530 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
29540 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
29550 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
29560 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
29570 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
29580 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
29590 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
295a0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
295b0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
295c0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
295d0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
295e0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
295f0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
29600 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
29610 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
29620 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
29630 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
29640 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
29650 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
29660 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
29670 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
29680 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
29690 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
296a0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
296b0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
296c0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
296d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
296e0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
296f0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
29700 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
29710 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
29720 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
29730 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
29740 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
29750 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
29760 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
29770 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
29780 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
29790 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
297a0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
297b0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
297c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
297d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
297e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
297f0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
29800 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
29810 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
29820 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
29830 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
29840 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
29850 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
29860 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
29870 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
29880 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
29890 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
298a0 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
298b0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
298c0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
298d0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
298e0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
298f0 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
29900 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
29910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29920 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29930 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29940 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29950 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29960 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29970 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
29980 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
29990 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
299a0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
299b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
299c0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
299d0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
299e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
299f0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
29a00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29a10 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29a20 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
29a30 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29a40 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
29a50 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29a60 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  e] = pCur->ix;. 
29a70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29a80 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75  ur->iPage] = pCu
29a90 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
29aa0 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  ->ix = 0;.  pCur
29ab0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74  ->iPage++;.  ret
29ac0 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
29ad0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
29ae0 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70   &pCur->pPage, p
29af0 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
29b00 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
29b10 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29b20 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
29b30 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
29b40 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
29b50 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
29b60 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
29b70 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
29b80 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
29b90 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
29ba0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
29bb0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
29bc0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
29bd0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
29be0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
29bf0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
29c00 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
29c10 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
29c20 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
29c30 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
29c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29c50 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29c60 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
29c70 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
29c80 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
29c90 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
29ca0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
29cb0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
29cc0 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
29cd0 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cf0 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
29d00 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
29d10 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
29d20 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
29d30 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
29d40 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
29d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
29d60 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
29d70 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
29d80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
29d90 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
29da0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
29db0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
29dc0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
29dd0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
29de0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
29df0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29e00 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
29e10 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
29e20 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
29e30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
29e40 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
29e50 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
29e60 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
29e70 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
29e80 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
29e90 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
29ea0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
29eb0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
29ec0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
29ed0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
29ee0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
29ef0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
29f00 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
29f10 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
29f20 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
29f30 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
29f40 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
29f50 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73  ge *pLeaf;.  ass
29f60 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29f70 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29f80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29f90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29fa0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29fb0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
29fc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29fd0 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
29fe0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29ff0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
2a000 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a010 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
2a020 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a030 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70  1], .    pCur->p
2a040 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  Page->pgno.  );.
2a050 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
2a060 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a070 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
2a080 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a090 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
2a0a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a0b0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2a0c0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2a0d0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a0e0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2a0f0 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
2a100 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a110 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20  e-1];.  pLeaf = 
2a120 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2a130 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2a140 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72  r->apPage[--pCur
2a150 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65  ->iPage];.  rele
2a160 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2a170 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Leaf);.}../*.** 
2a180 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a190 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2a1a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
2a1b0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2a1c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a1d0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
2a1e0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
2a1f0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2a200 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
2a210 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
2a220 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
2a230 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
2a240 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
2a250 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
2a260 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2a270 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
2a280 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
2a290 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
2a2a0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
2a2b0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
2a2c0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
2a2d0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
2a2e0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
2a2f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
2a300 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
2a310 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
2a320 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2a330 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
2a340 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72  VALID and this r
2a350 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
2a360 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68  QLITE_EMPTY. Oth
2a370 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63  erwise,.** the c
2a380 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
2a390 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
2a3a0 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  st cell located 
2a3b0 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28  on the root.** (
2a3c0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
2a3d0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
2a3e0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2a3f0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2a400 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2a410 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a420 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2a430 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2a440 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2a450 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2a460 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2a470 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2a480 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2a490 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2a4a0 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2a4b0 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2a4c0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2a4d0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2a4e0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2a4f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2a500 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a510 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2a520 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2a530 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2a540 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2a550 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2a560 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2a570 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2a580 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2a590 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2a5a0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2a5b0 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2a5c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a5d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2a5e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2a5f0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2a600 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a610 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2a620 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a630 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a640 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2a650 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2a660 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2a670 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2a680 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2a690 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2a6a0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2a6b0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2a6c0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2a6d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a6e0 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45  tate < CURSOR_RE
2a6f0 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75  QUIRESEEK || pCu
2a700 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20  r->iPage<0 );.  
2a710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a720 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72  noRoot>0 || pCur
2a730 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20  ->iPage<0 );..  
2a740 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2a750 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  =0 ){.    if( pC
2a760 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2a770 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2a780 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  tNull(pCur->pPag
2a790 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  e);.      while(
2a7a0 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29   --pCur->iPage )
2a7b0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2a7c0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2a7d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a7e0 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d  iPage]);.      }
2a7f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61  .      pCur->pPa
2a800 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2a810 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e[0];.      goto
2a820 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
2a830 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
2a840 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a850 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2a860 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2a870 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
2a880 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2a890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2a8a0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2a8b0 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28  =(-1) );.    if(
2a8c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
2a8d0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2a8e0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2a8f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a900 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2a910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a920 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
2a930 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2a940 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2a950 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  kipNext;.      }
2a960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2a970 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2a980 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2a990 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2a9a0 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
2a9b0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2a9c0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
2a9d0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2a9f0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2aa00 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2aa10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aa20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2aa30 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2aa40 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2aa50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2aa60 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
2aa70 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74      pCur->curInt
2aa80 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  Key = pCur->pPag
2aa90 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20  e->intKey;.  }. 
2aaa0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2aab0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2aac0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
2aad0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
2aae0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
2aaf0 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
2ab00 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
2ab10 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
2ab20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
2ab30 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
2ab40 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
2ab50 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
2ab60 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
2ab70 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
2ab80 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
2ab90 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
2aba0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2abb0 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
2abc0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
2abd0 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
2abe0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
2abf0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2ac00 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
2ac10 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
2ac20 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
2ac30 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
2ac40 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
2ac50 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
2ac60 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2ac70 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
2ac80 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
2ac90 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
2aca0 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
2acb0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
2acc0 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
2acd0 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
2ace0 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
2acf0 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
2ad00 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
2ad10 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
2ad20 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
2ad30 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2ad40 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
2ad50 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
2ad60 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
2ad70 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
2ad80 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
2ad90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
2ada0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2adb0 50 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50  PT_PAGE(pCur->pP
2adc0 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f  age);.  }..skip_
2add0 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e  init:  .  pCur->
2ade0 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2adf0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2ae00 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2ae10 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2ae20 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
2ae30 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2ae40 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  ;..  pRoot = pCu
2ae50 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2ae60 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
2ae70 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2ae80 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2ae90 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
2aea0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
2aeb0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
2aec0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
2aed0 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
2aee0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2aef0 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
2af00 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
2af10 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
2af20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2af30 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2af40 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2af50 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2af60 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
2af70 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
2af80 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2af90 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2afa0 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  D;.    rc = SQLI
2afb0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20  TE_EMPTY;.  }.  
2afc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2afd0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2afe0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2aff0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2b000 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b010 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2b020 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b030 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2b040 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2b050 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2b060 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2b070 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2b080 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2b090 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b0a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2b0b0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2b0c0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2b0d0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2b0e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2b0f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2b100 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b110 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b130 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b140 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2b150 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b160 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2b170 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2b180 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
2b190 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
2b1a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
2b1b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
2b1c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b1d0 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72  Cur->ix));.    r
2b1e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b1f0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
2b200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b210 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b220 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2b230 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
2b240 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2b250 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
2b260 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2b270 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
2b280 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
2b290 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
2b2a0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2b2b0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
2b2c0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
2b2d0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
2b2e0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
2b2f0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2b300 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
2b310 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
2b320 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
2b330 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2b340 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b350 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
2b360 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2b370 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
2b380 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2b390 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
2b3a0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
2b3b0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b3c0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
2b3d0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
2b3e0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2b3f0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2b400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2b410 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2b420 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b430 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b440 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b450 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2b460 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2b470 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2b480 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2b490 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2b4a0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2b4b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b4c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b4d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  ;.    pCur->ix =
2b4e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2b4f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b500 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2b510 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b520 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
2b530 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2b540 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
2b550 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2b560 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
2b570 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2b580 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2b590 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
2b5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b5b0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2b5c0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
2b5d0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b5e0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b5f0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2b600 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2b610 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2b620 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2b630 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2b640 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2b650 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2b660 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2b670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b680 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
2b690 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2b6a0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
2b6b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b6c0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b6d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b6e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b6f0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2b700 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2b710 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2b720 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b740 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b750 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
2b760 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2b770 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b780 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2b790 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2b7a0 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2b7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b7c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b7d0 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2b7e0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2b7f0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2b800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b810 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b820 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2b830 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2b840 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2b850 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2b860 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2b870 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2b880 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2b890 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2b8a0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2b8b0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2b8c0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2b8d0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2b8e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b8f0 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2b900 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2b910 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2b920 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b930 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b950 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b960 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b970 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2b980 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2b990 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2b9a0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2b9b0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2b9c0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2b9d0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2b9e0 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2b9f0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ba00 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2ba10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ba20 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2ba30 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2ba40 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2ba50 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2ba60 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2ba70 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2ba80 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2ba90 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2baa0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2bab0 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2bac0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2bad0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2bae0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2baf0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2bb00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2bb10 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2bb20 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2bb30 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2bb40 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2bb50 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2bb60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bb70 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2bb80 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2bb90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2bbb0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2bbc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2bbd0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2bbe0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2bbf0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2bc00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bc10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bc20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2bc30 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2bc40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2bc60 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2bc70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2bc80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2bc90 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2bca0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2bcb0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2bcc0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2bcd0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2bce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bcf0 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2bd00 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2bd10 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2bd20 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2bd30 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2bd40 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2bd50 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2bd60 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2bd70 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2bd80 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2bd90 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2bda0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2bdb0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2bdc0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2bdd0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2bde0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2bdf0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2be00 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2be10 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2be20 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2be30 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2be40 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2be50 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2be60 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2be70 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2be80 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2be90 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2bea0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2beb0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2bec0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2bed0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2bee0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2bef0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2bf00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2bf10 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2bf20 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2bf30 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2bf40 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2bf50 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2bf60 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2bf70 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2bf80 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2bf90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2bfa0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2bfb0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2bfc0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2bfd0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2bfe0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2bff0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c010 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c020 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c030 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c040 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c050 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c060 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c070 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c080 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c090 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c0a0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c0b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c0c0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c0d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c0e0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2c0f0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2c100 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2c110 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2c120 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2c130 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c140 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2c160 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2c170 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2c180 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2c190 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2c1a0 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2c1b0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2c1c0 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2c1d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c1e0 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2c1f0 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2c200 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2c210 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2c220 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2c230 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2c240 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2c250 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2c260 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2c270 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2c280 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2c290 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c2b0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2c2c0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2c2d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2c2e0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2c2f0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2c300 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2c310 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2c320 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2c330 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2c340 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2c350 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2c360 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2c370 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2c380 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c390 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c3a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c3b0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2c3c0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2c3d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2c3e0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2c3f0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2c400 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2c410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c420 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2c430 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2c440 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2c450 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2c460 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2c470 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2c480 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2c490 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2c4a0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2c4b0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2c4c0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2c4d0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2c4e0 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2c4f0 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2c500 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c510 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2c520 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c530 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2c540 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2c550 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2c560 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2c570 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2c580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c590 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2c5a0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2c5b0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2c5c0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2c5d0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2c5e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2c5f0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2c600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c610 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2c620 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2c630 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2c640 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2c650 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2c660 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2c670 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2c680 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c690 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2c6a0 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2c6b0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2c6c0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2c6d0 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2c6e0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2c6f0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2c700 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2c710 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2c720 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2c730 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2c740 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2c750 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2c760 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2c770 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2c780 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2c790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2c7a0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2c7b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c7c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c7d0 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c            getCel
2c7e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
2c7f0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2c800 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2c810 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2c820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c830 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2c840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2c860 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
2c870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c880 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c8a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2c8b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2c8c0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2c8d0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2c8e0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2c8f0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2c900 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2c910 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2c920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2c930 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2c940 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2c950 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2c960 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2c970 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2c980 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2c990 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c9a0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2c9b0 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2c9c0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2c9d0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2c9e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c9f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2ca10 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73  PTY ){.      ass
2ca20 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2ca30 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2ca40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2ca50 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2ca60 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2ca70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ca80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2ca90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2caa0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2cab0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cac0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2cad0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cae0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2caf0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2cb00 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2cb10 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73  Cell > 0 );.  as
2cb20 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2cb30 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  e==0 || pCur->ap
2cb40 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2cb50 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2cb60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cb70 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2cb80 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2cb90 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2cba0 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2cbb0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2cbc0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2cbd0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2cbe0 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  ge;.    u8 *pCel
2cbf0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2cc00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2cc10 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2cc20 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2cc30 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2cc40 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2cc50 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2cc60 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2cc70 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2cc80 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2cc90 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2cca0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2ccb0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2ccc0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2ccd0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2cce0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2ccf0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2cd00 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2cd10 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2cd20 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2cd30 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2cd40 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2cd50 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2cd60 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2cd70 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2cd80 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2cd90 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2cda0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2cdb0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2cdc0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2cdd0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2cde0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2cdf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2ce00 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2ce10 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2ce20 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2ce30 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2ce40 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2ce50 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2ce60 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2ce70 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2ce80 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2ce90 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2cea0 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2ceb0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2cec0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2ced0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2cee0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2cef0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2cf00 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2cf10 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2cf20 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2cf30 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2cf40 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2cf50 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2cf60 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2cf70 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2cf80 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2cf90 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2cfa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cfb0 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2cfc0 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2cfd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2cfe0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2cff0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2d000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d020 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2d030 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2d040 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2d050 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2d060 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d070 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2d080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2d090 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2d0a0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2d0b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2d0c0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2d0d0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2d0e0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2d0f0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d100 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2d110 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d120 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d130 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2d140 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2d150 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2d160 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2d170 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d180 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2d190 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2d1a0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d1b0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2d1c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d1d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d1e0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2d1f0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2d200 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2d210 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2d220 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2d230 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d240 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d250 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d260 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d2a0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2d2b0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2d2c0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2d2d0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2d2e0 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2d2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2d300 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2d310 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2d320 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2d330 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2d340 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2d350 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2d360 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2d370 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2d380 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2d390 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2d3a0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2d3b0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2d3c0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2d3d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2d3e0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2d3f0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2d400 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2d410 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2d420 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2d430 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2d440 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2d450 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2d460 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d470 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2d480 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2d490 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2d4a0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2d4b0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2d4c0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2d4d0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2d4e0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2d4f0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2d500 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2d510 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2d520 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2d530 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2d540 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2d550 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2d560 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2d570 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2d580 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2d590 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2d5a0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2d5b0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2d5c0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2d5d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2d5e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2d5f0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2d600 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2d610 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2d620 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2d630 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2d640 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d650 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2d660 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2d670 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2d680 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d690 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d6a0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2d6b0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2d6c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d6d0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2d6e0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2d6f0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2d700 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2d710 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2d720 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2d730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2d740 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2d750 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2d760 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2d770 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2d780 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2d790 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2d7a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2d7b0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2d7c0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2d7d0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2d7e0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2d7f0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2d800 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2d810 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2d820 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2d830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d840 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2d850 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2d860 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2d870 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2d880 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2d890 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2d8a0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2d8b0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2d8c0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2d8d0 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2d8e0 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2d8f0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2d900 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2d910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2d920 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2d930 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2d940 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2d950 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2d960 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2d970 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2d980 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2d990 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2d9a0 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2d9b0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2d9c0 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2d9d0 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2d9e0 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2d9f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2da00 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2da10 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2da20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2da30 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2da40 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2da50 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2da60 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2da70 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2da80 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2da90 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2daa0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2dab0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2dac0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2dad0 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2dae0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2daf0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2db00 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2db10 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2db20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2db30 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2db40 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2db50 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2db60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2db70 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2db80 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2db90 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2dba0 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2dbb0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2dbc0 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2dbd0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2dbe0 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2dbf0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2dc00 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2dc10 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2dc20 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2dc30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2dc40 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2dc50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2dc60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2dc70 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2dc80 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2dc90 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2dca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dcb0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2dcc0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2dcd0 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2dce0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2dcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2dd10 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2dd20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2dd30 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2dd40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2dd50 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2dd60 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2dd70 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2dd80 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2dd90 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2dda0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2ddb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2ddc0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2ddd0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2dde0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2ddf0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2de00 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2de10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2de20 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2de30 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2de40 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2de50 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2de60 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2de70 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2de80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2de90 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2dea0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2deb0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2dec0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2ded0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2dee0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2def0 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2df00 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2df10 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2df20 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2df30 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2df40 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2df50 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2df60 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2df70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2df80 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2df90 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2dfa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dfb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dfc0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2dfd0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2dfe0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2dff0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e000 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e010 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2e020 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2e030 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2e040 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e050 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2e060 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e080 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2e090 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2e0a0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2e0b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2e0c0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2e0d0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2e0e0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2e0f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e100 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2e110 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2e120 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2e130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e140 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2e150 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2e160 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2e170 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2e180 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2e190 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2e1a0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2e1b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2e1c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e1d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2e1e0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2e1f0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2e200 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2e210 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2e220 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2e230 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2e240 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e250 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e270 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2e280 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2e290 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2e2a0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
2e2b0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2e2c0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2e2d0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2e2e0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2e2f0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2e300 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2e310 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2e320 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2e330 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2e340 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2e350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e360 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e370 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2e380 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2e390 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2e3a0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2e3b0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2e3c0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2e3d0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2e3e0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2e3f0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2e400 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2e410 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2e420 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2e430 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2e440 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2e450 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2e460 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e470 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2e480 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2e490 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e4a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2e4b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2e4c0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2e4d0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2e4e0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2e4f0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2e500 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2e510 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2e520 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2e530 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2e540 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2e550 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2e560 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2e570 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2e580 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2e590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e5a0 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
2e5b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2e5c0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2e5d0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
2e5e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
2e5f0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2e600 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
2e610 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
2e620 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
2e630 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2e640 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2e650 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2e660 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
2e670 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
2e680 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e690 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e6a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e6b0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2e6c0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2e6d0 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
2e6e0 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
2e6f0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2e700 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
2e710 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
2e720 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
2e730 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
2e740 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
2e750 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
2e760 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
2e770 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
2e780 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2e790 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e7a0 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
2e7b0 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
2e7c0 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
2e7d0 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
2e7e0 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
2e7f0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
2e800 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
2e810 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
2e820 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
2e830 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
2e840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
2e850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2e860 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2e870 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2e880 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2e890 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2e8a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
2e8b0 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
2e8c0 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
2e8d0 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
2e8e0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
2e8f0 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
2e900 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
2e910 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2e920 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2e930 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2e940 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2e950 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2e960 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2e970 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2e980 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2e990 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2e9a0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2e9b0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2e9c0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2e9d0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2e9e0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2e9f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2ea00 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2ea10 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2ea20 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2ea30 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2ea40 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2ea50 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2ea60 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2ea70 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2ea80 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
2ea90 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
2eaa0 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
2eab0 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
2eac0 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
2ead0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
2eae0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2eaf0 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2eb00 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2eb10 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2eb20 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2eb30 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2eb40 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2eb50 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
2eb60 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2eb70 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
2eb80 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2eb90 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2eba0 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
2ebb0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2ebc0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2ebd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2ebe0 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2ebf0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2ec00 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2ec10 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2ec20 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2ec30 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ec40 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ec50 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2ec60 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2ec70 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2ec80 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
2ec90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2eca0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2ecb0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ecc0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ecd0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2ece0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2ecf0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2ed00 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2ed10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ed20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ed30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2ed40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2ed50 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2ed60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ed70 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2ed80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2ed90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2eda0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2edb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2edc0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2edd0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2ede0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2edf0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2ee00 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2ee10 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2ee20 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
2ee30 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2ee40 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2ee50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ee60 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2ee70 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2ee80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2ee90 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2eea0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2eeb0 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >ix;.  assert( p
2eec0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2eed0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2eee0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2eef0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2ef00 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2ef10 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2ef20 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2ef30 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2ef40 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2ef50 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2ef60 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2ef70 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2ef80 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2ef90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2efa0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2efb0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2efc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2efd0 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2efe0 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2eff0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2f000 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2f010 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2f020 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2f030 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2f040 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2f050 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2f060 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2f070 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f080 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2f090 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2f0a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2f0b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f0c0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2f0d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f0e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2f0f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2f100 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2f110 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2f120 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2f130 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2f140 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2f150 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2f160 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
2f170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2f180 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2f190 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2f1a0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2f1b0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
2f1c0 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
2f1d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2f1e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2f1f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2f200 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2f210 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
2f220 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f230 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2f240 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2f250 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2f260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2f270 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2f280 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f290 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
2f2a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2f2b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2f2c0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2f2d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2f2e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f2f0 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
2f300 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
2f310 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
2f320 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72  QLite */.  asser
2f330 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2f340 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2f350 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
2f360 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
2f370 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f380 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2f390 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f3a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2f3b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f3c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2f3d0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f3e0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2f3f0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
2f400 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f410 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2f420 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2f430 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
2f440 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2f450 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
2f460 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f470 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
2f480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
2f490 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
2f4a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2f4b0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2f4c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2f4d0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2f4e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f4f0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2f500 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2f510 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2f520 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2f530 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2f540 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  abase..** Return
2f550 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
2f560 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
2f570 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20   success.**     
2f580 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68  SQLITE_DONE   th
2f590 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2f5a0 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
2f5b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
2f5c0 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68  table.**     oth
2f5d0 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20  erwise     some 
2f5e0 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
2f5f0 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
2f600 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2f610 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2f620 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2f630 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2f640 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2f650 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2f660 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2f670 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2f680 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2f690 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2f6a0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2f6b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2f6c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2f6d0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2f6e0 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2f6f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2f700 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2f710 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2f720 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2f730 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2f740 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2f750 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
2f760 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74  the F argument t
2f770 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  o sqlite3BtreePr
2f780 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31  evious(C,F) is 1
2f790 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
2f7a0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
2f7b0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2f7c0 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
2f7d0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2f7e0 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
2f7f0 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
2f800 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
2f810 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
2f820 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68  gument is a.** h
2f830 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
2f840 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76  ment.  The nativ
2f850 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  e SQLite btree i
2f860 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2f870 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68  es not.** use th
2f880 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
2f890 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
2f8a0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2f8b0 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
2f8c0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2f8d0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2f8e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2f8f0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2f900 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2f910 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2f920 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2f930 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2f940 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f950 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2f960 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2f970 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2f980 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2f990 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2f9a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f9b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f9c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2f9d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f9e0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2f9f0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2fa00 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2fa10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2fa20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fa30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2fa40 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2fa50 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2fa60 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
2fa70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2fa80 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
2fa90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2faa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2fab0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2fac0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2fad0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2fae0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2faf0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2fb00 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2fb10 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2fb20 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2fb30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2fb40 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2fb50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fb60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2fb70 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2fb80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2fb90 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2fba0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2fbb0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2fbc0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2fbd0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2fbe0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2fbf0 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ix;.    rc = mov
2fc00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2fc10 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2fc20 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2fc30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2fc40 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2fc50 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2fc60 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2fc70 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2fc80 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->ix==0 ){.     
2fc90 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2fca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2fcb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2fcc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2fcd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fce0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
2fcf0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2fd00 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2fd10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2fd20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2fd30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fd40 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2fd50 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76   & (BTCF_ValidOv
2fd60 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2fd70 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20  pCur->ix--;.    
2fd80 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2fd90 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  age;.    if( pPa
2fda0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2fdb0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fdc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fdd0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
2fde0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
2fdf0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2fe00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2fe10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2fe20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2fe30 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2fe40 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
2fe50 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
2fe60 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2fe70 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2fe80 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2fe90 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
2fea0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2feb0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2fec0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2fed0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e  OR_VALID );.  UN
2fee0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
2fef0 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
2ff00 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
2ff10 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
2ff20 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72  e */.  pCur->cur
2ff30 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2ff40 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2ff50 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2ff60 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
2ff70 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2ff80 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ff90 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
2ffa0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d     || pCur->ix==
2ffb0 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50  0.   || pCur->pP
2ffc0 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  age->leaf==0.  )
2ffd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2ffe0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29  eePrevious(pCur)
2fff0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78  ;.  }.  pCur->ix
30000 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
30010 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
30020 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
30030 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
30040 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
30050 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
30060 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
30070 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
30080 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
30090 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
300a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
300b0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
300c0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
300d0 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
300e0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
300f0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
30100 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
30110 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
30120 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
30130 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
30140 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
30150 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
30160 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
30170 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
30180 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
30190 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
301a0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
301b0 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73  r.  *ppPage is s
301c0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
301d0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
301e0 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
301f0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
30200 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
30210 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73  hen an effort is
30220 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
30230 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
30240 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
30250 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
30260 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
30270 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
30280 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
30290 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
302a0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
302b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
302c0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
302d0 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
302e0 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
302f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
30300 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
30310 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  is BTALLOC_EXACT
30320 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20   and the nearby 
30330 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61  page exists.** a
30340 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
30350 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
30360 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
30370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
30380 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20   If.** eMode is 
30390 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20  BTALLOC_LT then 
303a0 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65  the page returne
303b0 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74  d will be less t
303c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
303d0 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79  to nearby if any
303e0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
303f0 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20  s.  If eMode is 
30400 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e  BTALLOC_ANY then
30410 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
30420 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e   restrictions on
30430 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72   which page is r
30440 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
30450 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
30460 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
30470 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
30480 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
30490 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
304a0 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53  pPage,      /* S
304b0 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tore pointer to 
304c0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
304d0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  ge here */.  Pgn
304e0 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20  o *pPgno,       
304f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
30500 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72   page number her
30510 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72  e */.  Pgno near
30520 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  by,           /*
30530 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61   Search for a pa
30540 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65  ge near this one
30550 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20   */.  u8 eMode  
30560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30570 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42  BTALLOC_EXACT, B
30580 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54  TALLOC_LT, or BT
30590 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a  ALLOC_ANY */.){.
305a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
305b0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
305c0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
305d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
305e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
305f0 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
30600 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
30610 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
30620 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
30630 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
30640 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
30650 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
30660 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
30670 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
30680 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
30690 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
306a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
306b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
306c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
306d0 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
306e0 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
306f0 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41  >0 && IfNotOmitA
30700 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  V(pBt->autoVacuu
30710 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  m)) );.  pPage1 
30720 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
30730 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
30740 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
30750 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
30760 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54   R-05119-02637 T
30770 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
30780 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
30790 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73  offset 36.  ** s
307a0 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65  tores stores the
307b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
307c0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
307d0 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d  eelist. */.  n =
307e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
307f0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
30800 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
30810 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
30820 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
30830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30840 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
30850 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
30860 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
30870 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
30880 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
30890 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
308a0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
308b0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
308c0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
308d0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
308e0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
308f0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
30900 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
30910 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
30920 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
30930 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
30940 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
30950 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
30960 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
30970 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
30980 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
30990 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
309a0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
309b0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
309c0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
309d0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
309e0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
309f0 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
30a00 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
30a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30a20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30a30 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
30a40 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
30a50 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
30a60 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
30a70 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
30a80 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
30a90 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
30aa0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
30ab0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
30ac0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30ad0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
30ae0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
30af0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30b00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
30b10 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
30b20 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
30b30 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30b40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
30b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
30b60 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
30b70 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
30b80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
30b90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
30ba0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
30bb0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
30bc0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
30bd0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
30be0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
30bf0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
30c00 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
30c10 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
30c20 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
30c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30c40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
30c50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
30c60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30c70 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
30c80 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30c90 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
30ca0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
30cb0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
30cc0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
30cd0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
30ce0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
30cf0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
30d00 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
30d10 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
30d20 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
30d30 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
30d40 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
30d50 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
30d60 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
30d70 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
30d80 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
30d90 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
30da0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
30db0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
30dc0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
30dd0 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
30de0 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
30df0 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
30e00 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
30e10 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
30e20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
30e30 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
30e40 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
30e50 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
30e60 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
30e70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
30e80 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
30e90 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
30ea0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
30eb0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
30ec0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
30ed0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
30ee0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
30ef0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
30f00 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
30f10 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
30f20 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
30f30 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
30f40 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
30f50 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
30f60 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
30f70 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
30f80 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
30f90 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
30fa0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
30fb0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
30fc0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
30fd0 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
30fe0 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
30ff0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31000 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31010 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
31020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
31030 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
31040 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
31050 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
31060 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
31070 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31080 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72  CORRUPT_PGNO(pPr
31090 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54  evTrunk ? pPrevT
310a0 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b  runk->pgno : 1);
310b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
310c0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
310d0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
310e0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
310f0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
31100 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31110 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31120 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
31130 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31140 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
31150 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
31160 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
31170 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
31180 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
31190 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
311a0 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
311b0 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
311c0 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
311d0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
311e0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
311f0 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
31200 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
31210 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
31220 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
31230 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
31240 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
31250 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
31260 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
31270 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
31280 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
31290 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
312a0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
312b0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
312c0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
312d0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
312e0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
312f0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
31300 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
31310 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
31320 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
31330 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31340 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
31350 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
31360 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31370 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31380 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
313a0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
313b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
313c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
313d0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
313e0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
313f0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
31400 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
31410 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
31420 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
31430 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
31440 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
31450 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
31460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
31470 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
31480 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
31490 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
314a0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
314b0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
314c0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
314d0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
314e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
314f0 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
31500 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31510 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
31520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31530 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31540 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
31550 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
31560 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
31570 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
31580 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
31590 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
315a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
315b0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
315c0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
315d0 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
315e0 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
315f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
31600 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
31610 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
31620 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
31630 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31640 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
31650 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
31660 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
31670 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31680 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
31690 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
316a0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
316b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
316c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
316d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
316e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
316f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
31700 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31710 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
31720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
31730 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
31740 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
31750 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
31760 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
31780 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31790 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
317a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
317b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
317c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
317d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
317e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
317f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31800 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
31810 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
31820 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
31830 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
31840 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
31870 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
31880 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
31890 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
318a0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
318b0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
318c0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
318d0 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
318e0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
318f0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
31900 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
31910 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31920 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31930 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
31940 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
31950 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
31960 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
31970 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
31980 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
31990 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
319a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
319b0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
319c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
319d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
319e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
319f0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31a00 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
31a10 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
31a20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
31a30 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
31a40 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
31a50 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
31a60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31a80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31a90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31ab0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31ac0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
31ad0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31ae0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31af0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31b00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
31b10 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
31b20 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
31b30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31b40 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31b50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
31b60 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
31b70 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
31b80 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
31b90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
31ba0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
31bb0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
31bc0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
31bd0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
31be0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
31bf0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
31c00 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
31c10 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31c20 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31c30 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
31c40 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
31c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31c60 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31c70 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
31c80 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
31c90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
31ca0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
31cb0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31cd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31ce0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31cf0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
31d00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31d10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31d20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31d30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31d40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31d50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
31d60 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
31d70 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
31d80 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31d90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31da0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
31db0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
31dc0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
31dd0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
31de0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
31df0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
31e00 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
31e10 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
31e20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
31e30 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
31e40 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
31e50 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
31e60 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
31e70 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
31e80 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
31e90 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
31ea0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
31eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
31ec0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
31ed0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
31ee0 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
31ef0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
31f00 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
31f10 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
31f30 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
31f40 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
31f50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31f60 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
31f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31f80 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
31fa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
31fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
31fd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
31fe0 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
31ff0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
32000 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
32010 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
32020 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
32030 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
32040 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
32050 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
32060 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
32070 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
32080 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
32090 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
320a0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
320b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
320c0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320e0 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
320f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32120 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
32130 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
32140 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
32150 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
32160 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
32170 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
32180 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
32190 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
321a0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
321b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
321c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
321d0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
321e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
321f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
32220 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
32230 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
32240 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
32250 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
32260 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
32270 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
32280 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
32290 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
322a0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
322b0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
322c0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
322d0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
322e0 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
322f0 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
32300 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
32310 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
32320 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
32330 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32340 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
32350 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
32360 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
32370 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32380 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32390 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
323a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
323b0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
323c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
323d0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
323e0 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
323f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
32400 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
32410 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
32420 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
32430 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
32440 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
32450 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
32460 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
32470 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
32480 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
32490 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
324a0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
324b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
324c0 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
324d0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
324e0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
324f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32510 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32520 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
32530 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
32540 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
32570 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
32580 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
32590 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
325a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
325b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
325c0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
325d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
325e0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
325f0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
32600 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
32610 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
32620 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
32630 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
32640 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
32650 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
32660 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
32670 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
32680 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
32690 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
326a0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
326b0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
326c0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
326d0 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
326e0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
326f0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
32700 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
32710 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
32720 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
32730 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
32740 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
32750 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
32760 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
32770 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
32780 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
32790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
327a0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
327b0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
327c0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
327d0 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
327e0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
327f0 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
32800 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
32810 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
32820 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
32830 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
32840 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
32850 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
32860 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
32870 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
32880 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
32890 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
328a0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
328b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
328c0 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
328d0 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
328e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
328f0 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
32900 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
32910 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
32920 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
32930 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
32940 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
32950 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
32960 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
32970 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
32980 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
32990 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
329a0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
329b0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
329c0 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
329d0 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
329e0 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
329f0 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
32a00 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
32a10 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
32a20 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
32a30 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
32a40 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
32a50 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
32a60 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
32a70 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
32a80 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
32a90 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
32aa0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
32ab0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
32ac0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
32ad0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
32ae0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32af0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
32b00 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
32b10 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
32b20 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
32b30 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
32b40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32b50 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
32b60 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32b70 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
32b80 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
32b90 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
32ba0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
32bb0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
32bc0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
32bd0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
32be0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
32bf0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
32c00 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
32c10 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
32c20 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
32c30 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
32c40 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
32c50 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
32c60 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
32c70 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
32c80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
32c90 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
32ca0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
32cb0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
32cc0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
32cd0 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
32ce0 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
32cf0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
32d00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32d10 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
32d20 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32d30 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
32d40 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
32d50 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
32d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32d70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
32d80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32d90 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
32da0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
32db0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
32dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32dd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32de0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
32df0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
32e00 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
32e10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
32e20 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
32e30 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
32e40 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
32e50 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
32e60 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
32e70 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
32e80 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
32e90 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
32ea0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
32eb0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
32ec0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
32ed0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
32ee0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
32ef0 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
32f00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
32f10 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
32f20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32f30 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
32f40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
32f50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32f60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32f70 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
32f80 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
32f90 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
32fa0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
32fb0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
32fc0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
32fd0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
32fe0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
32ff0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
33000 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33010 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
33020 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
33030 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
33040 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
33050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
33060 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
33070 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
33080 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
33090 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
330a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
330b0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
330c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
330d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
330e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
330f0 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
33100 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
33110 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
33120 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
33130 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
33140 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33150 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
33160 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
33170 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
33180 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
33190 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
331a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
331b0 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
331c0 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
331d0 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
331e0 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
331f0 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
33200 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
33210 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
33220 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
33230 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
33240 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
33250 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
33260 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
33270 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
33280 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
33290 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
332a0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
332b0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
332c0 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
332d0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
332e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
332f0 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
33300 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
33310 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
33320 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
33330 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
33340 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33350 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
33360 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
33370 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33390 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
333a0 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
333b0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
333c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
333d0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
333e0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
333f0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
33400 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
33410 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
33420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33430 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
33440 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
33450 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33470 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
33480 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
33490 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
334b0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
334c0 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
334d0 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
334e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
334f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
33500 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
33510 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
33520 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
33530 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
33540 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
33550 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
33560 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
33570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33580 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
33590 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
335a0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
335b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
335c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
335d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
335e0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
335f0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
33600 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
33610 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
33620 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
33630 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
33640 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33650 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
33660 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
33670 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33680 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
33690 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
336a0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
336b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
336c0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
336d0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
336e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
336f0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
33700 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
33710 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
33720 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
33730 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
33740 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
33750 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
33760 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
33770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33780 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
33790 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
337a0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
337b0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
337c0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
337d0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
337e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
337f0 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
33800 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
33810 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33820 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
33830 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
33840 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
33850 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
33860 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
33870 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
33880 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
33890 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
338a0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
338b0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
338c0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
338d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
338e0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
338f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
33900 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
33910 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
33920 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33930 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33940 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
33950 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
33960 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
33970 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
33980 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
33990 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
339a0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
339b0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
339c0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
339d0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
339e0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
339f0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
33a00 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
33a10 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
33a20 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
33a30 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
33a40 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
33a50 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
33a60 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
33a70 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
33a80 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
33a90 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
33aa0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
33ab0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
33ac0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
33ad0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
33ae0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
33af0 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
33b00 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
33b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
33b30 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
33b40 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
33b50 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
33b60 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
33b70 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
33b80 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
33b90 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
33ba0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
33bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33bc0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
33bd0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
33be0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
33bf0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
33c00 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
33c10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
33c20 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
33c30 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
33c40 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
33c50 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
33c60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
33c70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
33c80 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
33c90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
33ca0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
33cb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
33cc0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
33cd0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33ce0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
33cf0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
33d00 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
33d10 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
33d20 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
33d30 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
33d40 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
33d50 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
33d60 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
33d70 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
33d80 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
33d90 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
33da0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
33db0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
33dc0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
33dd0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
33de0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
33df0 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
33e00 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33e10 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
33e20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
33e30 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
33e40 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
33e50 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
33e60 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
33e70 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
33e80 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
33e90 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
33ea0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
33eb0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
33ec0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
33ed0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
33ee0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
33ef0 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
33f00 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
33f10 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
33f20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
33f30 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
33f40 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
33f50 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
33f60 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
33f70 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
33f80 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
33f90 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
33fa0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
33fb0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
33fc0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
33fd0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
33fe0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
33ff0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
34000 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
34010 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
34020 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
34030 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
34040 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
34050 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
34060 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
34070 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
34080 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
34090 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
340a0 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
340b0 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
340c0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
340d0 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
340e0 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
340f0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
34100 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
34110 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
34120 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
34130 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
34140 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34150 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
34160 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
34170 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34190 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
341a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
341b0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
341c0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
341d0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
341e0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
341f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
34200 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
34210 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
34220 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
34230 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34240 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
34250 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
34260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
34270 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
34280 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
34290 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
342a0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
342b0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
342c0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
342d0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
342e0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
342f0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34300 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
34310 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
34320 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
34330 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
34340 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
34350 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
34360 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
34370 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
34380 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
34390 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
343a0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
343b0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
343c0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
343d0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
343e0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
343f0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
34400 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34410 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
34420 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
34430 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
34440 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
34450 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
34460 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
34470 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
34480 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
34490 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
344a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
344b0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
344c0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
344d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
344e0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
344f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
34500 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34520 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
34530 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
34540 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
34550 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
34560 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
34570 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
34580 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
34590 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
345a0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
345b0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
345c0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
345d0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
345e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
345f0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
34600 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
34610 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
34620 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
34630 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34640 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
34650 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
34660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
34670 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
34680 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
34690 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
346a0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
346b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
346c0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
346d0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
346e0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
346f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
34700 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
34710 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
34720 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
34730 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
34740 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20  local Cell size 
34750 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  (the number of b
34760 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67  ytes on the orig
34770 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74  inal page, omitt
34780 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29  ing.** overflow)
34790 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a   into *pnSize..*
347a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
347b0 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
347c0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
347d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
347e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
347f0 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
34800 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
34810 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
34820 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
34830 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
34840 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  fo          /* S
34850 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
34860 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a  about the cell *
34870 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
34880 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  *pBt;.  Pgno ovf
34890 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
348a0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
348b0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
348c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
348d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
348e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
348f0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
34900 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
34910 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
34920 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f    if( pInfo->nLo
34930 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79  cal==pInfo->nPay
34940 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75  load ){.    retu
34950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
34960 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
34970 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
34980 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
34990 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
349a0 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69  pCell+pInfo->nSi
349b0 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44  ze-1 > pPage->aD
349c0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
349d0 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65  age ){.    /* Ce
349e0 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
349f0 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
34a00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34a10 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
34a20 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c  age);.  }.  ovfl
34a30 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
34a40 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
34a50 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42 74  Size - 4);.  pBt
34a60 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
34a70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
34a80 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
34a90 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
34aa0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34ab0 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
34ac0 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
34ad0 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c   - pInfo->nLocal
34ae0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
34af0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
34b00 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
34b10 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
34b20 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e  RRUPT_DB && (pIn
34b30 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f  fo->nPayload + o
34b40 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66  vflPageSize)<ovf
34b50 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a  lPageSize).  );.
34b60 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
34b70 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
34b80 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
34b90 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
34ba0 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
34bb0 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
34bc0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
34bd0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
34be0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
34bf0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
34c00 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
34c10 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
34c20 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
34c30 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
34c40 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
34c50 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
34c60 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
34c70 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
34c80 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
34c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34ca0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34cb0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
34cc0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
34cd0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
34ce0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
34cf0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
34d00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34d10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
34d20 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
34d30 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
34d40 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
34d50 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
34d60 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
34d70 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
34d80 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
34d90 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
34da0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
34db0 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
34dc0 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
34dd0 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
34de0 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
34df0 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
34e00 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
34e10 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
34e20 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
34e30 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
34e40 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
34e50 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
34e60 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
34e70 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
34e80 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
34e90 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
34ea0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
34eb0 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
34ec0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
34ed0 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
34ee0 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
34ef0 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
34f00 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
34f10 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
34f20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
34f30 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
34f40 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
34f50 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
34f60 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
34f70 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
34f80 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
34f90 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
34fa0 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
34fb0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
34fc0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
34fd0 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
34fe0 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
34ff0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
35000 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
35010 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35020 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35030 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
35040 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
35050 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
35060 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
35070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
35080 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
35090 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
350a0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
350b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
350c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
350d0 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
350e0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
350f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35100 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
35110 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
35120 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
35130 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
35140 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
35150 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
35160 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
35170 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
35180 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
35190 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
351a0 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
351b0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
351c0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
351d0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
351e0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
351f0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
35200 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
35210 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
35220 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
35230 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
35240 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
35250 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
35260 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
35270 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
35280 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
35290 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
352a0 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
352b0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
352c0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
352d0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
352e0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
352f0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
35300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
35310 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
35320 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
35330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35340 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
35350 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
35360 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
35370 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
35380 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
35390 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
353a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65  */.  const Btree
353b0 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20  Payload *pX,    
353c0 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77      /* Payload w
353d0 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e  ith which to con
353e0 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20  struct the cell 
353f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
35400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35410 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
35420 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
35430 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
35440 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
35450 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
35460 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74  n, rc, mn;.  int
35470 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
35480 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
35490 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
354a0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
354b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
354c0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
354d0 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  d *pBt;.  Pgno p
354e0 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e  gnoOvfl;.  int n
354f0 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
35500 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35510 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
35520 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
35530 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
35540 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
35550 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
35560 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
35570 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
35580 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
35590 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
355a0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
355b0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
355c0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
355d0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
355e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
355f0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  >pBt->pageSize].
35600 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
35610 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35620 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35630 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
35640 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
35650 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
35660 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
35670 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50  trSize;.  if( pP
35680 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
35690 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58     nPayload = pX
356a0 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a  ->nData + pX->nZ
356b0 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  ero;.    pSrc = 
356c0 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e  pX->pData;.    n
356d0 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b  Src = pX->nData;
356e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
356f0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
35700 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  ; /* fillInCell(
35710 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  ) only called fo
35720 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20  r leaves */.    
35730 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
35740 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
35750 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
35760 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  );.    nHeader +
35770 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
35780 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
35790 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a  64*)&pX->nKey);.
357a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
357b0 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30  ert( pX->nKey<=0
357c0 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58 2d  x7fffffff && pX-
357d0 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20  >pKey!=0 );.    
357e0 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20  nSrc = nPayload 
357f0 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b  = (int)pX->nKey;
35800 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e  .    pSrc = pX->
35810 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65  pKey;.    nHeade
35820 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
35830 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
35840 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d  , nPayload);.  }
35850 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
35860 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
35870 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
35880 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
35890 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
358a0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
358b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
358c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
358d0 77 68 65 72 65 20 65 76 65 72 79 74 68 69 6e 67  where everything
358e0 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74 72   fits on the btr
358f0 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 61  ee page.    ** a
35900 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nd no overflow p
35910 61 67 65 73 20 61 72 65 20 72 65 71 75 69 72 65  ages are require
35920 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48  d. */.    n = nH
35930 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
35940 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
35950 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
35960 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
35970 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
35980 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
35990 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   n;.    assert( 
359a0 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29  nSrc<=nPayload )
359b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
359c0 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b  nSrc<nPayload );
359d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
359e0 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72 63  load, pSrc, nSrc
359f0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
35a00 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20  ayload+nSrc, 0, 
35a10 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a  nPayload-nSrc);.
35a20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35a30 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
35a40 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
35a50 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
35a60 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74 68   that some of th
35a70 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e  e content will n
35a80 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c  eed.  ** to spil
35a90 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l onto overflow 
35aa0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e  pages..  */.  mn
35ab0 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
35ac0 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28  al;.  n = mn + (
35ad0 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25  nPayload - mn) %
35ae0 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
35af0 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
35b00 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
35b10 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
35b20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
35b30 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
35b40 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70  1 );.  if( n > p
35b50 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
35b60 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65   n = mn;.  space
35b70 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53  Left = n;.  *pnS
35b80 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
35b90 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72 20  r + 4;.  pPrior 
35ba0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
35bb0 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73  +n];.  pToReleas
35bc0 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66  e = 0;.  pgnoOvf
35bd0 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20 70  l = 0;.  pBt = p
35be0 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a  Page->pBt;..  /*
35bf0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76   At this point v
35c00 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20  ariables should 
35c10 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77  be set as follow
35c20 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e  s:.  **.  **   n
35c30 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
35c40 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20    Total payload 
35c50 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20  size in bytes.  
35c60 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20  **   pPayload   
35c70 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72          Begin wr
35c80 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65  iting payload he
35c90 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c  re.  **   spaceL
35ca0 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61  eft          Spa
35cb0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ce available at 
35cc0 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50  pPayload.  If nP
35cd0 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74  ayload>spaceLeft
35ce0 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ,.  **          
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
35d00 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d   means content m
35d10 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f  ust spill into o
35d20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
35d30 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20   **   *pnSize   
35d40 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
35d50 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20   the local cell 
35d60 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76  (not counting ov
35d70 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20  erflow pages).  
35d80 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20  **   pPrior     
35d90 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f          Where to
35da0 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20   write the pgno 
35db0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
35dc0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a  rflow page.  **.
35dd0 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20    ** Use a call 
35de0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
35df0 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79  lPtr() to verify
35e00 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
35e10 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65   above.  ** were
35e20 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63   computed correc
35e30 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  tly..  */.#ifdef
35e40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
35e50 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
35e60 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
35e70 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
35e80 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
35e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
35ea0 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f  ader==(int)(info
35eb0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
35ec0 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
35ed0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d  ( info.nKey==pX-
35ee0 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73  >nKey );.    ass
35ef0 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20  ert( *pnSize == 
35f00 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20  info.nSize );.  
35f10 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c    assert( spaceL
35f20 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  eft == info.nLoc
35f30 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  al );.  }.#endif
35f40 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
35f50 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68   payload into th
35f60 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64  e local Cell and
35f70 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20   any extra into 
35f80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a  overflow pages *
35f90 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
35fa0 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
35fb0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
35fc0 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
35fd0 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
35fe0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
35ff0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
36000 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
36010 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
36020 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
36030 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
36040 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
36050 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
36060 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36070 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
36080 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36090 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
360a0 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
360b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
360c0 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
360d0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
360e0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
360f0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
36100 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
36110 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
36120 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
36130 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
36140 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
36150 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
36160 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
36170 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
36180 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36190 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
361a0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e  .    if( nSrc>=n
361b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
361c0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
361d0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   n);.    }else i
361e0 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
361f0 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20     n = nSrc;.   
36200 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
36210 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
36220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
36230 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
36240 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
36250 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
36260 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64      if( nPayload
36270 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  <=0 ) break;.   
36280 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
36290 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
362a0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
362b0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
362c0 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  ;.    if( spaceL
362d0 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eft==0 ){.      
362e0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
362f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
36300 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36310 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
36320 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
36330 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
36340 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
36350 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
36360 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
36370 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36380 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
36390 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
363a0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
363b0 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
363c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
363d0 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
363e0 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
363f0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
36400 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
36410 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
36420 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
36430 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
36440 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
36450 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
36460 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
36470 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
36480 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
36490 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
364a0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
364b0 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
364c0 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
364d0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
364e0 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
364f0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
36500 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
36510 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
36520 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
36530 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
36540 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
36550 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
36560 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
36570 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
36580 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
36590 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
365a0 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
365b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
365c0 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
365d0 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
365e0 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
365f0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
36600 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
36610 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
36620 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
36630 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
36640 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
36650 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
36660 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
36670 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
36680 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
36690 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
366a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
366b0 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
366c0 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
366d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
366e0 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
366f0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
36700 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
36710 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
36720 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
36730 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36740 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
36750 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
36760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36770 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
36780 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
36790 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
367a0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
367b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
367c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
367d0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
367e0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
367f0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
36800 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
36810 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
36820 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
36830 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
36840 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
36850 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
36860 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
36870 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36880 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
36890 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
368a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
368b0 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
368c0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
368d0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
368e0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
368f0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
36900 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
36910 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
36920 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
36930 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
36940 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
36950 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
36960 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
36970 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36980 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36990 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
369a0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
369b0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
369c0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
369d0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
369e0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
369f0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
36a00 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
36a10 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
36a20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
36a30 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
36a40 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
36a50 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
36a60 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
36a70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
36a80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
36a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
36aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
36ab0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
36ac0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
36ad0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
36ae0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
36af0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
36b00 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
36b10 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
36b20 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
36b30 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
36b40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
36b50 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
36b60 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
36b70 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
36b80 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
36b90 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
36ba0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
36bb0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
36bc0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
36bd0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
36be0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
36bf0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
36c00 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
36c10 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
36c20 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
36c30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
36c40 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
36c50 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
36c60 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
36c70 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
36c80 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
36c90 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
36ca0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
36cb0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
36cc0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
36cd0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
36ce0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
36cf0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
36d00 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
36d10 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
36d20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
36d30 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
36d40 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
36d50 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
36d60 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
36d70 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
36d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
36d90 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d  RRUPT_DB || sz==
36da0 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
36db0 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
36dc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
36dd0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36de0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
36df0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
36e00 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
36e10 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
36e20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
36e30 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
36e40 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
36e50 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
36e60 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
36e70 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
36e80 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
36e90 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
36ea0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
36eb0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
36ec0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
36ed0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
36ee0 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50 61   if( pc+sz > pPa
36ef0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
36f00 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
36f10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36f20 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
36f30 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
36f40 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
36f50 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
36f60 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
36f70 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
36f80 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
36f90 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  l--;.  if( pPage
36fa0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
36fb0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
36fc0 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
36fd0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
36fe0 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  0;.    put2byte(
36ff0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50  &data[hdr+5], pP
37000 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
37010 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
37020 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
37030 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37040 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   - pPage->hdrOff
37050 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
37060 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61             - pPa
37070 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
37080 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 8;.  }else{. 
37090 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20     memmove(ptr, 
370a0 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
370b0 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
370c0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
370d0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
370e0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  ->nCell);.    pP
370f0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
37100 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
37110 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
37120 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
37130 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
37140 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
37150 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
37160 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
37170 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
37180 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
37190 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
371a0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
371b0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
371c0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
371d0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
371e0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
371f0 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
37200 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
37210 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
37220 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
37230 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
37240 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
37250 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
37260 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
37270 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
37280 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
37290 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
372a0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
372b0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
372c0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
372d0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
372e0 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
372f0 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
37300 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
37310 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  emented..**.** *
37320 70 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49  pRC must be SQLI
37330 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
37340 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
37350 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
37360 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
37370 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
37380 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
37390 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
373a0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
373b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
373c0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
373d0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
373e0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
373f0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
37400 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
37410 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
37420 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
37430 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
37440 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
37450 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
37460 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
37470 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
37480 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
37490 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
374a0 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
374b0 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
374c0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
374d0 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
374e0 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
374f0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
37500 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
37510 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
37520 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
37530 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
37540 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
37550 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
37560 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
37570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
37580 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
37590 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
375a0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
375b0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
375c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73  ge */.  u8 *pIns
375d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
375e0 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d   point in pPage-
375f0 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72  >aCellIdx[] wher
37600 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74  e no cell insert
37610 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
37620 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRC==SQLITE_OK
37630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e   );.  assert( i>
37640 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
37650 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
37660 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
37670 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67  rt( MX_CELL(pPag
37680 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
37690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
376a0 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
376b0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c  L(pPage->pBt) ||
376c0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
376d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
376e0 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79  nOverflow<=Array
376f0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
37700 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
37710 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
37720 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79  ->apOvfl)==Array
37730 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76  Size(pPage->aiOv
37740 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
37750 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37760 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
37770 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
37780 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
37790 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
377a0 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
377b0 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
377c0 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
377d0 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
377e0 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
377f0 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
37800 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
37810 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
37820 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
37830 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
37840 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
37850 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
37860 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
37870 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
37880 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
37890 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
378a0 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
378b0 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
378c0 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
378d0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
378e0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
378f0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
37900 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
37910 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
37920 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
37930 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
37940 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
37950 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
37960 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
37970 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65  emcpy(pTemp, pCe
37980 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70  ll, sz);.      p
37990 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
379a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
379b0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
379c0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
379d0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
379e0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
379f0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f  low++;.    /* Co
37a00 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
37a10 20 41 72 72 61 79 53 69 7a 65 2d 31 20 73 69 6e   ArraySize-1 sin
37a20 63 65 20 77 65 20 68 6f 6c 64 20 62 61 63 6b 20  ce we hold back 
37a30 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f 74 0a 20  one extra slot. 
37a40 20 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69     ** as a conti
37a50 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65  ngency.  In othe
37a60 72 20 77 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e  r words, never n
37a70 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 33 20  eed more than 3 
37a80 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
37a90 73 6c 6f 74 73 20 62 75 74 20 34 20 61 72 65 20  slots but 4 are 
37aa0 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73 74 20  allocated, just 
37ab0 74 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20  to be safe. */. 
37ac0 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 41     assert( j < A
37ad0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
37ae0 61 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20  apOvfl)-1 );.   
37af0 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
37b00 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
37b10 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
37b20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f  = (u16)i;..    /
37b30 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
37b40 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c  overflows occur,
37b50 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   they are always
37b60 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20   sequential and 
37b70 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  in.    ** sorted
37b80 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e   order.  This in
37b90 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62  variants arise b
37ba0 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20  ecause multiple 
37bb0 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20  overflows can.  
37bc0 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20    ** only occur 
37bd0 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
37be0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
37bf0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
37c00 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  e during.    ** 
37c10 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74  balancing, and t
37c20 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20  he dividers are 
37c30 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72  adjacent and sor
37c40 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
37c50 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
37c60 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
37c70 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20  1]<(u16)i ); /* 
37c80 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72  Overflows in sor
37c90 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
37ca0 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
37cb0 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66   i==pPage->aiOvf
37cc0 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a  l[j-1]+1 );   /*
37cd0 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73   Overflows are s
37ce0 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d  equential */.  }
37cf0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
37d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37d10 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
37d20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
37d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37d40 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
37d50 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
37d60 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37d70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37d80 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
37d90 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
37da0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
37db0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
37dc0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
37dd0 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d  lOffset]==pPage-
37de0 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20  >aCellIdx );.   
37df0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
37e00 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
37e10 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
37e20 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
37e30 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
37e40 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
37e50 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
37e60 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
37e70 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a  wing properties.
37e80 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
37e90 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
37ea0 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
37eb0 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20   idx >= 0 );.   
37ec0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
37ed0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
37ee0 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
37ef0 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  +2 || CORRUPT_DB
37f00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37f10 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
37f20 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37f30 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
37f40 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
37f50 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
37f60 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
37f70 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
37f80 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
37f90 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37fa0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
37fb0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
37fc0 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65  Ins = pPage->aCe
37fd0 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20  llIdx + i*2;.   
37fe0 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c   memmove(pIns+2,
37ff0 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d   pIns, 2*(pPage-
38000 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20  >nCell - i));.  
38010 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c    put2byte(pIns,
38020 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65   idx);.    pPage
38030 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f  ->nCell++;.    /
38040 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
38050 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  cell count */.  
38060 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50    if( (++data[pP
38070 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34  age->hdrOffset+4
38080 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61  ])==0 ) data[pPa
38090 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
380a0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
380b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
380c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
380d0 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  3])==pPage->nCel
380e0 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l );.#ifndef SQL
380f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
38100 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
38110 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
38120 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
38130 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
38140 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
38150 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
38160 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
38170 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
38180 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
38190 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
381a0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
381b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
381c0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
381d0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
381e0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
381f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43    }.}../*.** A C
38200 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20  ellArray object 
38210 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65  contains a cache
38220 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64   of pointers and
38230 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20   sizes for a.** 
38240 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75  consecutive sequ
38250 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68  ence of cells th
38260 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64  at might be held
38270 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61 67   on multiple pag
38280 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  es..*/.typedef s
38290 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
382a0 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63  CellArray;.struc
382b0 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20  t CellArray {.  
382c0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
382d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
382e0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
382f0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  Cell[] */.  MemP
38300 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20  age *pRef;      
38310 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
38320 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
38330 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
38340 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
38350 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
38360 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
38370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
38380 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
38390 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
383a0 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
383b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65  Make sure the ce
383c0 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c  ll sizes at idx,
383d0 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78   idx+1, ..., idx
383e0 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a  +N-1 have been.*
383f0 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  * computed..*/.s
38400 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c  tatic void popul
38410 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c  ateCellCache(Cel
38420 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69  lArray *p, int i
38430 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  dx, int N){.  as
38440 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
38450 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20  idx+N<=p->nCell 
38460 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  );.  while( N>0 
38470 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
38480 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30