/ Hex Artifact Content
Login

Artifact 41ab526796e7f3cc6e4c6d096c90ad35f0d3d1fe65964dcc0c4fddbbc7ad349d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
7490: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
74a0: 54 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c  T(pCur).       |
74b0: 7c 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42  | pCur==sqlite3B
74c0: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
74d0: 73 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72  sor() );.  asser
74e0: 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  t( offsetof(BtCu
74f0: 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30  rsor, eState)==0
7500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
7510: 7a 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74  zeof(pCur->eStat
7520: 65 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  e)==1 );.  retur
7530: 6e 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21  n CURSOR_VALID !
7540: 3d 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a  = *(u8*)pCur;.}.
7550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b  pointer to a fak
7570: 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
7580: 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61  t that will alwa
7590: 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c  ys answer.** fal
75a0: 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  se to the sqlite
75b0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
75c0: 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61  oved() routine a
75d0: 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a  bove.  The fake.
75e0: 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e  ** cursor return
75f0: 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  ed must not be u
7600: 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  sed with any oth
7610: 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61  er Btree interfa
7620: 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20  ce..*/.BtCursor 
7630: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b  *sqlite3BtreeFak
7640: 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69  eValidCursor(voi
7650: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20  d){.  static u8 
7660: 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52  fakeCursor = CUR
7670: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73  SOR_VALID;.  ass
7680: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74  ert( offsetof(Bt
7690: 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d  Cursor, eState)=
76a0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
76b0: 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43  BtCursor*)&fakeC
76c0: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
76d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
76e0: 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62  tores a cursor b
76f0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
7700: 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74  nal position aft
7710: 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65  er it.** has bee
7720: 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20  n moved by some 
7730: 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79  outside activity
7740: 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65   (such as a btre
7750: 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a  e rebalance or.*
7760: 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62  * a row having b
7770: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
7780: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
7790: 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  ursor).  .**.** 
77a0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20  On success, the 
77b0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70  *pDifferentRow p
77c0: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
77d0: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
77e0: 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
77f0: 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74  ing at exactly t
7800: 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70  he same row.  *p
7810: 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74  DifferntRow is t
7820: 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
7830: 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e  r.** was pointin
7840: 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65  g to has been de
7850: 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74  leted, forcing t
7860: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
7870: 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65  nt to some.** ne
7880: 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  arby row..**.** 
7890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
78a0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
78b0: 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  ed for a cursor 
78c0: 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e  that just return
78d0: 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20  ed.** TRUE from 
78e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
78f0: 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f  orHasMoved()..*/
7900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
7910: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42  eCursorRestore(B
7920: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
7930: 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  nt *pDifferentRo
7940: 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  w){.  int rc;.. 
7950: 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
7960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7970: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
7980: 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
7990: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
79a0: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
79b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
79c0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
79d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
79e0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
79f0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7a00: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
7a10: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7a30: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
7a40: 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  ipNext==0 );.   
7a50: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7a70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7a80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7a90: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
7aa0: 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  S./*.** Provide 
7ab0: 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72  hints to the cur
7ac0: 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63  sor.  The partic
7ad0: 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20  ular hint given 
7ae0: 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a  (and the type.**
7af0: 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74   and number of t
7b00: 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d  he varargs param
7b10: 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d  eters) is determ
7b20: 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e  ined by the eHin
7b30: 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74  tType.** paramet
7b40: 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66  er.  See the def
7b50: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  initions of the 
7b60: 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63  BTREE_HINT_* mac
7b70: 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ros for details.
7b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b90: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28  BtreeCursorHint(
7ba0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7bb0: 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e  int eHintType, .
7bc0: 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f  ..){.  /* Used o
7bd0: 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68  nly by system th
7be0: 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68  at substitute th
7bf0: 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20  eir own storage 
7c00: 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64  engine */.}.#end
7c10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  if../*.** Provid
7c20: 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20  e flag hints to 
7c30: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  the cursor..*/.v
7c40: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7c50: 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28  CursorHintFlags(
7c60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7c70: 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61  unsigned x){.  a
7c80: 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f  ssert( x==BTREE_
7c90: 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54  SEEK_EQ || x==BT
7ca0: 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20  REE_BULKLOAD || 
7cb0: 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  x==0 );.  pCur->
7cc0: 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23  hints = x;.}...#
7cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ce0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
7cf0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
7d00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
7d10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
7d20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
7d30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
7d40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
7d50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
7d60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
7d70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
7d80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
7d90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
7da0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
7db0: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
7dc0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7dd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
7de0: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
7df0: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
7e00: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
7e10: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
7e20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
7e30: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
7e40: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
7e50: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
7e60: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
7e70: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
7e80: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
7e90: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
7ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7eb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7ec0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
7ed0: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
7ee0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7ef0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
7f00: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
7f10: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
7f20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7f30: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
7f40: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7f50: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7f60: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7f70: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7f80: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7f90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7fa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
7fb0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
7fc0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
7fe0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
7ff0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8000: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
8010: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
8020: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
8030: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
8040: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
8050: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
8060: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
8070: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
8080: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
8090: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
80a0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
80b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
80c0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
80d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
80e0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
80f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8100: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
8110: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8120: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
8130: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
8140: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
8150: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
8160: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8170: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
8180: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
81a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
81b0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
81c0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
81d0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
81e0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
81f0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
8200: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8210: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8230: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
8240: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
8250: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
8260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
8290: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
82a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
82b0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
82c0: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
82d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
82e0: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
82f0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
8300: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
8310: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
8320: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
8330: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
8340: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
8350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8360: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
8370: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
8380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8390: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
83a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
83b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
83c0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
83d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
83e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
83f0: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
8400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  urn;.  }.  offse
8410: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8420: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8430: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8440: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  <0 ){.    *pRC =
8450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8460: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8470: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8480: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8490: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
84a0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
84b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
84c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
84d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
84e0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
84f0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
8500: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8510: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
8520: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
8530: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
8540: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
8550: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
8560: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
8570: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
8580: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
8590: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
85a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85b0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
85c0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
85d0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
85e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
85f0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
8600: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
8610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8620: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
8630: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
8640: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
8650: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
8670: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
8680: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
8690: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
86a0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
86b0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
86c0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
86d0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
86e0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
86f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8700: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
8710: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8720: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
8730: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
8740: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
8750: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8760: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
8770: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
8780: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8790: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
87a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
87b0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
87c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
87d0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
87e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
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 64 61 74  ter map page dat
8810: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
8820: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
8830: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
8840: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
8860: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8870: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
8880: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
8890: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
88a0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
88b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
88c0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
88d0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
88e0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
88f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8900: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
8910: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
8920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8930: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
8940: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8950: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
8960: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
8970: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
8980: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8990: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
89a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
89b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
89c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
89d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
89e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
89f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8a00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8a10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8a20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8a30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8a50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8a60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8a70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8a80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8aa0: 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d  RRUPT_PGNO(iPtrm
8ab0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ap);.  return SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
8ad0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
8ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8af0: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
8b00: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
8b10: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
8b20: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
8b30: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
8b40: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8b50: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
8b60: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
8b70: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
8b80: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
8b90: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
8ba0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
8bb0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
8bc0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
8bd0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
8be0: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
8bf0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8c00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
8c10: 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61  **.** findCellPa
8c20: 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65  stPtr() does the
8c30: 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20   same except it 
8c40: 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69  skips past the i
8c50: 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65  nitial.** 4-byte
8c60: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66   child pointer f
8c70: 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72  ound on interior
8c80: 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65   pages, if there
8c90: 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54   is one..**.** T
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
8cb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
8cc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
8cd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
8ce0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
8cf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
8d00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
8d10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
8d20: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
8d30: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
8d40: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
8d50: 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  e findCellPastPt
8d60: 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  r(P,I) \.  ((P)-
8d70: 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50  >aDataOfst + ((P
8d80: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8d90: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8da0: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
8db0: 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54  I)]))).../*.** T
8dc0: 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61  his is common ta
8dd0: 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  il processing fo
8de0: 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  r btreeParseCell
8df0: 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72  Ptr() and.** btr
8e00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8e10: 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61  dex() for the ca
8e20: 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c  se when the cell
8e30: 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e   does not fit en
8e40: 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73  tirely.** on a s
8e50: 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67  ingle B-tree pag
8e60: 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61  e.  Make necessa
8e70: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74  ry adjustments t
8e80: 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a  o the CellInfo.*
8e90: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
8ea0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8eb0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65  INLINE void btre
8ec0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
8ed0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
8ee0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8ef0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8f00: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8f10: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
8f20: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
8f30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8f40: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
8f50: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8f60: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8f70: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8f80: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8f90: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
8fa0: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
8fb0: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
8fc0: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
8fd0: 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63  have.  ** to dec
8fe0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8ff0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
9000: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
9010: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76  ill onto.  ** ov
9020: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
9030: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
9040: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
9050: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
9060: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
9070: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
9080: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
9090: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
90a0: 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62  torage.  ** in b
90b0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
90c0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
90d0: 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  **.  ** Warning:
90e0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
90f0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
9100: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
9110: 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77  ed in any.  ** w
9120: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
9130: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
9140: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
9150: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
9160: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
9170: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9180: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9190: 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c  /.  int maxLocal
91a0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
91b0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
91c0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
91d0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
91e0: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
91f0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9200: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9210: 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20   */..  minLocal 
9220: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
9230: 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  l;.  maxLocal = 
9240: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
9250: 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e  .  surplus = min
9260: 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  Local + (pInfo->
9270: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
9280: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
9290: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b  ->usableSize-4);
92a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
92b0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29  plus==maxLocal )
92c0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
92d0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
92e0: 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c  1 );.  if( surpl
92f0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
9300: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9310: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
9320: 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  us;.  }else{.   
9330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9340: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
9350: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69    }.  pInfo->nSi
9360: 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66  ze = (u16)(&pInf
9370: 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66  o->pPayload[pInf
9380: 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65  o->nLocal] - pCe
9390: 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll) + 4;.}../*.*
93a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
93b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
93c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
93d0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
93e0: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
93f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9400: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9410: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9420: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9430: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9440: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9450: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
9460: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
9470: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
9480: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
9490: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
94a0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
94b0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
94c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
94d0: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
94e0: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
94f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9500: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9510: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9520: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9530: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9540: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
9550: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
9560: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
9570: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
9580: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
9590: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
95a0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
95b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
95c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
95d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
95e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
95f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9600: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9610: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9620: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9630: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9640: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9650: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9680: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96a0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
96b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
96c0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
96d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96e0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
96f0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
9700: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
9710: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
9720: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
9730: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9740: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
9750: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9760: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9770: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
9780: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
9790: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
97a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
97b0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
97c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
97d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
97e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
97f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9800: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9810: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9820: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9830: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9840: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9850: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9860: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9880: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9890: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
98a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
98b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
98d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
98e0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
98f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
9900: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
9910: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9920: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9930: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9950: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9960: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9980: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
99a0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
99b0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
99c0: 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65  pCell;..  /* The
99d0: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
99e0: 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ode is equivalen
99f0: 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
9a00: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
9a10: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
9a20: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a  nPayload);.  **.
9a30: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
9a40: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
9a50: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
9a60: 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  l..  */.  nPaylo
9a70: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9a80: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9a90: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9aa0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ab0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ac0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9ae0: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9af0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70  .    }while( (*p
9b10: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b30: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f  .  pIter++;..  /
9b40: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9b50: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9b60: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9b70: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9b80: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
9b90: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
9ba0: 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a  >nKey);.  **.  *
9bb0: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
9bc0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
9bd0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
9be0: 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70    */.  iKey = *p
9bf0: 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79  Iter;.  if( iKey
9c00: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9c10: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9c20: 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20  7];.    iKey &= 
9c30: 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28  0x7f;.    while(
9c40: 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d  1){.      iKey =
9c50: 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b   (iKey<<7) | (*+
9c60: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9c70: 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65        if( (*pIte
9c80: 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b  r)<0x80 ) break;
9c90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
9ca0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
9cb0: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
9cc0: 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20  8) | *++pIter;. 
9cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49    pIter++;..  pI
9d00: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36  nfo->nKey = *(i6
9d10: 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66  4*)&iKey;.  pInf
9d20: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9d30: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9d40: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9d50: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9d60: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9d70: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9d80: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9d90: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9da0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9db0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9dc0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9dd0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9de0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9df0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9e00: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9e10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9e20: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9e30: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9e40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9e50: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9e60: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9e70: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9e80: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9e90: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ea0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9eb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9ec0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9ed0: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9ee0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9ef0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9f00: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9f10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9f20: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9f30: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
9f40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9f50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9f60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9f70: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9f90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9fa0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9fb0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9fd0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9fe0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ff0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
a000: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
a010: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
a020: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
a030: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
a040: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a050: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
a060: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
a070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a080: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a090: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a0a0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
a0b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
a0c0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
a0d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a0e0: 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  f==0 );.  pIter 
a0f0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
a100: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
a110: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
a120: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
a130: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
a140: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
a150: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
a160: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
a170: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
a180: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
a190: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a1a0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a1b0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a1c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a1d0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a1e0: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
a1f0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a200: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a210: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
a220: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
a230: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
a240: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a250: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a260: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
a270: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
a280: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a290: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
a2a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a2b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
a2c0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
a2d0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
a2e0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
a2f0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
a300: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
a310: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
a320: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a330: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
a340: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
a350: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a360: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
a370: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
a380: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
a390: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
a3a0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
a3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65  }else{.    btree
a3c0: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
a3d0: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70  izeForOverflow(p
a3e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
a3f0: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  fo);.  }.}.stati
a400: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
a410: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
a420: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a430: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a440: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a450: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
a460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a470: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
a480: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
a490: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a4a0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a4b0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a4c0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  ture */.){.  pPa
a4d0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a4e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
a4f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
a500: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nfo);.}../*.** T
a510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a520: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a530: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a540: 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69   MemPage.xCellSi
a550: 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ze.** method..**
a560: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a570: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a580: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
a590: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
a5a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
a5b0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
a5c0: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
a5d0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
a5e0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
a5f0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
a600: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
a610: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
a620: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
a630: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
a640: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a650: 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a  r..**.** cellSiz
a660: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20  ePtrNoPayload() 
a670: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e     =>   table in
a680: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
a690: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20  cellSizePtr()   
a6a0: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61            =>   a
a6b0: 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26  ll index nodes &
a6c0: 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65   table leaf node
a6d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  s.*/.static u16 
a6e0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
a6f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a700: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a710: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
a720: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a730: 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  e; /* For loopin
a740: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a750: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a760: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a790: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a7a0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20    u32 nSize;    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a7d0: 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  ze value to retu
a7e0: 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  rn */..#ifdef SQ
a7f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a800: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a820: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a830: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a840: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a850: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a860: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a870: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a880: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a890: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a8a0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a8b0: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a8c0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a8e0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a8f0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a900: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a910: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a920: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a930: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a940: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a950: 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65  .#endif..  nSize
a960: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a970: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
a980: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a990: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
a9a0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
a9b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
a9c0: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
a9d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a9e0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a9f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
aa00: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
aa10: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
aa20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
aa30: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
aa40: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aa50: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aa60: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aa70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aa80: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aa90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aaa0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
aab0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
aac0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
aad0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
aae0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
aaf0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
ab00: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
ab10: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
ab20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
ab30: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
ab40: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ab50: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
ab60: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
ab70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
ab80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
ab90: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aba0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
abb0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
abc0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
abd0: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
abe0: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
abf0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
ac00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
ac10: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
ac20: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
ac30: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
ac40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ac50: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
ac60: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ac70: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
ac80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ac90: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
aca0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
acb0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
acc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
acd0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
ace0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
acf0: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
ad00: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
ad10: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
ad20: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
ad30: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
ad40: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
ad50: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
ad60: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
ad70: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
ad80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ad90: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
ada0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
adb0: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
adc0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
add0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
ade0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
adf0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
ae00: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
ae10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae20: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
ae30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ae40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
ae50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
ae60: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
ae70: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
ae80: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
ae90: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
aea0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
aeb0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
aec0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
aed0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
aee0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
aef0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
af00: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
af10: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
af20: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
af30: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
af40: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
af50: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
af60: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
af70: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
af80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
af90: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
afa0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
afb0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
afc0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
afd0: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
afe0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
aff0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b000: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b010: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b020: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b030: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b040: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b050: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b060: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b080: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b090: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b0a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b0b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b0c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b0d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b0e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b0f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b100: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b110: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b120: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b130: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b140: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b160: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b170: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b180: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b190: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b1a0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b1b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b1c0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b1d0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b1e0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b1f0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b210: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b220: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b230: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b240: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b250: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b270: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b2a0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b2b0: 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
b2c0: 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
b2d0: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
b2e0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
b2f0: 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20  .nSize-4]);.    
b300: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
b310: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
b320: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
b330: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
b340: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
b350: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
b360: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
b370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
b380: 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20  organizes cells 
b390: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61  within the.** pa
b3a0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b3b0: 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f   are no free-blo
b3c0: 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  cks on the free-
b3d0: 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  block list..**.*
b3e0: 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78  * Parameter nMax
b3f0: 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69  Frag is the maxi
b400: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
b410: 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74  agmented space t
b420: 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72  hat may be.** pr
b430: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67  esent in the pag
b440: 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  e after this rou
b450: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tine returns..**
b460: 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  .** EVIDENCE-OF:
b470: 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53   R-44582-60138 S
b480: 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74  QLite may from t
b490: 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72  ime to time reor
b4a0: 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72  ganize a.** b-tr
b4b0: 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ee page so that 
b4c0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
b4d0: 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d  eblocks or fragm
b4e0: 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a  ent bytes, all.*
b4f0: 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  * unused bytes a
b500: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
b510: 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20  the unallocated 
b520: 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e  space region, an
b530: 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61  d all.** cells a
b540: 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c  re packed tightl
b550: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
b560: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
b570: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
b580: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
b590: 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46  pPage, int nMaxF
b5a0: 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rag){.  int i;  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
b5d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b600: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
b610: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b640: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b650: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
b660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b670: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
b680: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b6a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
b6b0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
b6c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
b6d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
b6e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b6f0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
b700: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
b710: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
b720: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b730: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
b740: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
b750: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b770: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
b780: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
b790: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
b7a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
b7b0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
b7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
b7d0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
b7e0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
b7f0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
b800: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
b810: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
b820: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
b830: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
b860: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
b870: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
b880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
b890: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
b8a0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65  index */..  asse
b8b0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b8c0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b8d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b8e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b8f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b900: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
b910: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
b920: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
b930: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
b940: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b950: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b960: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b970: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b980: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
b990: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
b9a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b9b0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
b9c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
b9d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
b9e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
b9f0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ba00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
ba10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
ba20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
ba30: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
ba40: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ba50: 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53  nCell;.  usableS
ba60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
ba70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
ba80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68   /* This block h
ba90: 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74  andles pages wit
baa0: 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66  h two or fewer f
bab0: 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e  ree blocks and n
bac0: 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20  MaxFrag.  ** or 
bad0: 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64  fewer fragmented
bae0: 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20   bytes. In this 
baf0: 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65  case it is faste
bb00: 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20  r to move the.  
bb10: 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20  ** two (or one) 
bb20: 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20  blocks of cells 
bb30: 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20  using memmove() 
bb40: 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75  and add the requ
bb50: 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74  ired.  ** offset
bb60: 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65  s to each pointe
bb70: 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  r in the cell-po
bb80: 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e  inter array than
bb90: 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20   it is to .  ** 
bba0: 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  reconstruct the 
bbb0: 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f  entire page.  */
bbc0: 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61  .  if( (int)data
bbd0: 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61  [hdr+7]<=nMaxFra
bbe0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72  g ){.    int iFr
bbf0: 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ee = get2byte(&d
bc00: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
bc10: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
bc20: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
bc30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bc40: 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20  iFree]);..      
bc50: 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  /* pageFindSlot(
bc60: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65  ) has already ve
bc70: 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65  rified that free
bc80: 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74   blocks are sort
bc90: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f  ed.      ** in o
bca0: 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77  rder of offset w
bcb0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20  ithin the page, 
bcc0: 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63  and that no bloc
bcd0: 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20  k extends.      
bce0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
bcf0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f  of the page. Pro
bd00: 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72  vided the two fr
bd10: 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20  ee slots do not 
bd20: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61  .      ** overla
bd30: 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  p, this guarante
bd40: 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d  es that the memm
bd50: 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f  ove() calls belo
bd60: 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20  w will not.     
bd70: 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68   ** overwrite th
bd80: 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74  e usableSize byt
bd90: 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69  e buffer, even i
bda0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
bdb0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
bdc0: 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20  corrupt.  */.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bde0: 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69  2==0 || iFree2>i
bdf0: 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Free );.      as
be00: 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32  sert( iFree+get2
be10: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
be20: 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  +2]) <= usableSi
be30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
be40: 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c  rt( iFree2==0 ||
be50: 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65   iFree2+get2byte
be60: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
be70: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
be80: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
be90: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
bea0: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
beb0: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
bec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
bed0: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
bee0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
bef0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
bf00: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
bf10: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
bf20: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
bf30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
bf40: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
bf50: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
bf60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
bf80: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
bf90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bfa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
bfb0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
bfc0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
bfd0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
bfe0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bff0: 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b 20 2f  +sz<=iFree2 ); /
c000: 2a 20 56 65 72 69 66 69 65 64 20 62 79 20 70 61  * Verified by pa
c010: 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a 2f 0a  geFindSlot() */.
c020: 20 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20            sz2 = 
c030: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c040: 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20  Free2+2]);.     
c050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c060: 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32  ee+sz+sz2+iFree2
c070: 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75  -(iFree+sz) <= u
c080: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c090: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
c0a0: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a  data[iFree+sz+sz
c0b0: 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b  2], &data[iFree+
c0c0: 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72  sz], iFree2-(iFr
c0d0: 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20  ee+sz));.       
c0e0: 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20     sz += sz2;.  
c0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c100: 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20  cbrk = top+sz;. 
c110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
c120: 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20  brk+(iFree-top) 
c130: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
c140: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
c150: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  (&data[cbrk], &d
c160: 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d  ata[top], iFree-
c170: 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  top);.        fo
c180: 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65  r(pAddr=&data[ce
c190: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72  llOffset]; pAddr
c1a0: 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29  <pEnd; pAddr+=2)
c1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  {.          pc =
c1c0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
c1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c1e0: 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32  pc<iFree ){ put2
c1f0: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
c200: 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  z); }.          
c210: 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65  else if( pc<iFre
c220: 65 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  e2 ){ put2byte(p
c230: 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d  Addr, pc+sz2); }
c240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c250: 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65     goto defragme
c260: 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  nt_out;.      }.
c270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72      }.  }..  cbr
c280: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
c290: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
c2a0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
c2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
c2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
c2d0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
c2e0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
c2f0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
c300: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c310: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
c320: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
c330: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
c340: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
c350: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
c360: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
c370: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
c380: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
c390: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
c3a0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
c3b0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
c3c0: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
c3d0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
c3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c3f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
c400: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
c410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c420: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c430: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
c440: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
c450: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
c460: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c470: 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e    size = pPage->
c480: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c490: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
c4a0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
c4b0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
c4c0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
c4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c4f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c500: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
c510: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c520: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c530: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c540: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c550: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c580: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c590: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c5a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c5b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c5c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c5d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c5f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c600: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c620: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c630: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c640: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c650: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c660: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c670: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c680: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c690: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c6a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c6b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c6c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c6d0: 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  ;.. defragment_o
c6e0: 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68  ut:.  if( data[h
c6f0: 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c  dr+7]+cbrk-iCell
c700: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
c710: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
c720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c730: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c740: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c750: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c760: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c770: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c780: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c790: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c7a0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c7b0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c7c0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c7d0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c7e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c7f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c800: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c830: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c840: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c850: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c860: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c870: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c880: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c890: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c8a0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c8b0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c8c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c8d0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c8e0: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c8f0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c900: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c910: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c920: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c930: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c940: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c950: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c960: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c970: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c980: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c990: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c9a0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c9b0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c9c0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c9d0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c9e0: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c9f0: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
ca00: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
ca10: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
ca20: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
ca30: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
ca40: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
ca50: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
ca60: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
ca70: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
ca80: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
ca90: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
caa0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
cab0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
cac0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
cad0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
cae0: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
caf0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
cb00: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
cb10: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
cb20: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
cb30: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
cb40: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
cb50: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
cb60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
cb70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cb80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
cb90: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
cba0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
cbb0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
cbc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cbd0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
cbe0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
cbf0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
cc00: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
cc10: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
cc20: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
cc30: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
cc40: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
cc50: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
cc60: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
cc70: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
cc80: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
cc90: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
cca0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
ccb0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
ccc0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
ccd0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
cce0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccf0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
cd00: 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  ( size+pc > usab
cd10: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
cd20: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
cd30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
cd40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
cd50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
cd60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
cd70: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cd80: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
cd90: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
cda0: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
cdb0: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
cdc0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
cdd0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
cde0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
cdf0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
ce00: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
ce10: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
ce20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
ce30: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
ce40: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ce50: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
ce60: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
ce70: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ce80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
ce90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
cea0: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
ceb0: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
ced0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
cee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
cf00: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
cf10: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
cf20: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
cf30: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
cf40: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
cf50: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
cf60: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
cf70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
cf80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
cf90: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
cfa0: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
cfb0: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
cfc0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
cfd0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
cfe0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
cff0: 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64 72      if( pc<iAddr
d000: 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20  +size ) break;. 
d010: 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b 0a 20   }.  if( pc ){. 
d020: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
d030: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
d040: 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
d050: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
d060: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d070: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
d080: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
d090: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
d0a0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
d0b0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
d0c0: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
d0d0: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
d0e0: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
d0f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
d100: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
d110: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
d120: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
d130: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
d140: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
d150: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
d160: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
d170: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
d180: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
d190: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
d1a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
d1b0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
d1c0: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
d1d0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
d1e0: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
d1f0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
d200: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
d210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
d220: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
d230: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
d240: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
d250: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
d260: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
d270: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
d280: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
d290: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
d2a0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
d2b0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
d2c0: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
d2d0: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
d2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2f0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d310: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
d320: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
d330: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d340: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
d350: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
d360: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
d370: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
d380: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d390: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
d3a0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d3b0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
d3c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d3f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
d400: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
d410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d430: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
d440: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
d450: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
d460: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
d470: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
d480: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
d490: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
d4a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
d4c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d4e0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d520: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
d530: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
d540: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
d550: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d560: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d580: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
d590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
d5a0: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
d5b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d5c0: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
d5d0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
d5e0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
d5f0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
d600: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
d610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
d620: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
d630: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
d640: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
d660: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
d670: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
d680: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
d690: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
d6a0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
d6b0: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
d6c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
d6d0: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
d6e0: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
d6f0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
d700: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
d710: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
d720: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
d730: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
d740: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
d750: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
d760: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
d770: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
d780: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
d790: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
d7a0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
d7b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d7c0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
d7d0: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
d7e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d7f0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
d800: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
d810: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
d820: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
d830: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
d840: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
d850: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
d860: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
d870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d890: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d8a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d8b0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
d8c0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
d8d0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
d8e0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
d8f0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
d900: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
d910: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
d920: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
d930: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
d940: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
d950: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
d960: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
d970: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
d980: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
d990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
d9a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d9b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
d9c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d9d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
d9e0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
d9f0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
da00: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
da10: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
da20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
da30: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
da40: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
da50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
da60: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
da70: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
da80: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
da90: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
daa0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
dab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dac0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
dad0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dae0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
daf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
db00: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
db10: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
db20: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
db30: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
db40: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
db50: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
db60: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
db80: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
db90: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
dba0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
dbb0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
dbc0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
dbd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
dbe0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
dbf0: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
dc00: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
dc10: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
dc20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dc30: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
dc40: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
dc50: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
dc60: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
dc70: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
dc80: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
dc90: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
dca0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
dcb0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
dcc0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
dcd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
dce0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
dcf0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
dd00: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
dd10: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
dd20: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
dd30: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
dd40: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
dd50: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
dd60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
dd70: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
dd80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
dd90: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
dda0: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
ddb0: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
ddc0: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
ddd0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
dde0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ddf0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
de00: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
de10: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
de20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
de30: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
de40: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
de50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
de60: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
de70: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
de80: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
de90: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
dea0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
deb0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
dec0: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
ded0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
dee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
def0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
df00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
df10: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
df20: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
df30: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
df40: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
df50: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
df60: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
df70: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
df80: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
df90: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
dfa0: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
dfb0: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
dfc0: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
dfd0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
dfe0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
dff0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
e000: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
e010: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
e020: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
e030: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
e040: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
e050: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
e060: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e080: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
e090: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
e0a0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
e0b0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
e0c0: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
e0d0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
e0e0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e110: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
e120: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
e130: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e160: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
e170: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
e180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
e1b0: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
e1c0: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
e1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
e1f0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
e200: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
e210: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
e220: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
e230: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
e240: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
e250: 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20  .  u16 x;       
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
e280: 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
e290: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32  nt area */.  u32
e2a0: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
e2b0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
e2c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e2d0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
e2e0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
e2f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e310: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
e320: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
e330: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
e340: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e350: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
e360: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
e370: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
e380: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
e390: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
e3a0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
e3b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
e3c0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e3d0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
e3e0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
e3f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
e400: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e410: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e430: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
e440: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
e450: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
e460: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
e470: 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  art<=pPage->pBt-
e480: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
e490: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
e4a0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
e4b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
e4c0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
e4d0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
e4e0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
e4f0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e500: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
e510: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
e520: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
e550: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
e560: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
e570: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
e580: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
e590: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
e5a0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
e5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e5c0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
e5d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e5e0: 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29  iPtr]))<iStart )
e5f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
e600: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20  eBlk<iPtr+4 ){. 
e610: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
e620: 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Blk==0 ) break;.
e630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e650: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e660: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
e670: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
e680: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e690: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
e6a0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
e6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e6c0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e6d0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
e6e0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
e6f0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
e700: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
e710: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
e720: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
e730: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
e740: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
e750: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
e760: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
e770: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
e780: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
e790: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
e7a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
e7b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
e7c0: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
e7d0: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
e7e0: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
e7f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e800: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
e810: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
e820: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
e830: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
e840: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
e850: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
e860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e870: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e880: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
e890: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
e8a0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
e8b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
e8c0: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
e8d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e8f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
e900: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
e910: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e920: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e930: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e950: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e960: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e970: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e980: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e990: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e9a0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e9b0: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e9c0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e9d0: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e9e0: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e9f0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
ea00: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
ea10: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
ea20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
ea30: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
ea40: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
ea50: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
ea60: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
ea70: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
ea80: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
ea90: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
eaa0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
eab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eac0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
ead0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
eae0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
eaf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
eb00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
eb10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
eb20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
eb30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
eb40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
eb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
eb60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
eb70: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
eb80: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
eb90: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
eba0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
ebb0: 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a  f( iStart<=x ){.
ebc0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
ebd0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
ebe0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
ebf0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec00: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
ec10: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
ec20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ec30: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
ec40: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
ec50: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
ec60: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
ec70: 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21  Start<x || iPtr!
ec80: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
ec90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
eca0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ecb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ecc0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
ecd0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ece0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
ecf0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
ed00: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
ed10: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
ed20: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
ed30: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
ed40: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ed50: 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
ed60: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
ed70: 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
ed80: 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ECURE ){.    /* 
ed90: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
eda0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
edb0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
edc0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
edd0: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73      ** option is
ede0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20   enabled */.    
edf0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
ee00: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
ee10: 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
ee20: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
ee30: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32  FreeBlk);.  put2
ee40: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
ee50: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
ee60: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
ee70: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
ee80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ee90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
eea0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
eeb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
eec0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
eed0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
eee0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
eef0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
ef00: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
ef10: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
ef20: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
ef30: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
ef40: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
ef50: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
ef60: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
ef70: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ef80: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
ef90: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
efa0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
efb0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
efc0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
efd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
efe0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
eff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
f010: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
f020: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
f030: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
f040: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
f050: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f060: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
f070: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
f080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
f090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
f0a0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
f0b0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
f0c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f0d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f0e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f0f0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
f100: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
f110: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
f120: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
f130: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
f140: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
f150: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
f160: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
f170: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
f180: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f190: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
f1a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
f1b0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
f1e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
f1f0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
f200: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
f210: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f220: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
f230: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
f240: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f250: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f260: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
f270: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
f280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
f290: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
f2a0: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
f2b0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f2c0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
f2d0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
f2e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f2f0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
f300: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
f310: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
f320: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
f330: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
f340: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
f350: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f360: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
f370: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
f380: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f3b0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
f3c0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f3d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f3e0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f3f0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f410: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f420: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f430: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f440: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f450: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f460: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f470: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f480: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f490: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f4a0: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
f4b0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
f4c0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
f4d0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
f4e0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
f4f0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f510: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
f520: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f530: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
f540: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
f550: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
f560: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
f570: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
f580: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f590: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f5a0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
f5b0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
f5c0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
f5d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f5e0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f5f0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f600: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f610: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f620: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f630: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f640: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f650: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f660: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f670: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f680: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f690: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f6a0: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f6b0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f6c0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f6d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f6e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
f6f0: 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
f700: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
f710: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
f720: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
f750: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
f760: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
f770: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
f780: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f790: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f7a0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f7b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f7c0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f7d0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f7e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f7f0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f810: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f820: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f830: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f840: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f850: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f860: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f870: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f880: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f890: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f8b0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f8c0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
f8d0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
f8e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
f8f0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
f900: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
f910: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
f920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f930: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f940: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f950: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
f960: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f970: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f980: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
f990: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
f9a0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
f9b0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
f9c0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
f9d0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
f9e0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
f9f0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63   page */.  u16 c
fa00: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
fa10: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
fa20: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
fa30: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
fa40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
fa50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fa60: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
fa70: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
fa80: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
fa90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
faa0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
fab0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fac0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
fad0: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
fae0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
faf0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
fb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
fb10: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
fb20: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
fb30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb40: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
fb50: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
fb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fb70: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
fb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fb90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fbb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
fbc0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
fbd0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
fbe0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
fbf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fc00: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
fc10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
fc20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
fc30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fc40: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
fc50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
fc60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fc70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fc80: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  e->isInit==0 );.
fc90: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
fca0: 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  pBt;.  hdr = pPa
fcb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fcc0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
fcd0: 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Data;.  /* EVIDE
fce0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
fcf0: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
fd00: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
fd10: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
fd20: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
fd30: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
fd40: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
fd50: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
fd60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
fd80: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
fd90: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
fda0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
fdb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
fdc0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
fdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
fde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
fdf0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
fe00: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
fe10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
fe20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
fe30: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
fe40: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
fe50: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
fe60: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
fe70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
fe80: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
fe90: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
fea0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
feb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
fec0: 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
fed0: 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
fee0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
fef0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ff00: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ff10: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ff20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ff30: 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
ff40: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
ff50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ff60: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
ff70: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
ff80: 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
ff90: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ffa0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
ffb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
ffc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
ffd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
ffe0: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
fff0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10000 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
10010 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
10020 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
10030 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
10040 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
10050 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
10060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
10070 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
10080 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
10090 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
100a0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
100b0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
100c0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
100d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
100e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
100f0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
10100 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
10110 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
10120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10130 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
10140 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
10150 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
10160 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  h is only.  ** p
10170 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
10180 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
10190 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
101a0 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
101b0 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  he.  ** offset t
101c0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
101d0 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
101e0 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
101f0 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20   minus the.  ** 
10200 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
10210 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73  d space. */.  as
10220 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
10230 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
10240 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
10250 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41  PT_DB );..  /* A
10260 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
10270 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
10280 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
10290 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  past the end.  *
102a0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
102b0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
102c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
102d0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
102e0 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
102f0 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
10300 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a  cell extends.  *
10310 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
10320 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
10330 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
10340 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
10350 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  e .  ** returned
10360 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
10370 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  /.  iCellFirst =
10380 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
10390 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
103a0 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
103b0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
103c0 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
103d0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
103e0 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  zeCk ){.    int 
103f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
10400 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
10410 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
10420 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ay */.    int sz
10430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10440 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
10450 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
10460 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10470 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st--;.    for(i=
10480 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
10490 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
104a0 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
104b0 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
104c0 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
104e0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
104f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10500 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
10510 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10520 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10530 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10550 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10560 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10570 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
10580 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
10590 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
105a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
105b0 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
105c0 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a  .      if( pc+sz
105d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
105e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
105f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10600 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10620 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10630 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20  CellLast++;.  } 
10640 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20   ..  /* Compute 
10650 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10660 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10670 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10680 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10690 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
106a0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
106b0 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
106c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
106d0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
106e0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
106f0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10700 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
10710 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
10720 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10730 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
10740 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
10750 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10760 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10770 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10780 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10790 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
107a0 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
107b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
107c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
107d0 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
107e0 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
107f0 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
10800 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
10810 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
10820 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
10830 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10840 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
10850 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10860 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10870 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a  T_PAGE(pPage); .
10880 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10890 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
108a0 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
108b0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
108c0 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
108d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
108e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
108f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10900 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
10910 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
10920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10930 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10940 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10950 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10960 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10970 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10980 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
109a0 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
109b0 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
109c0 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
109d0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
109e0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
109f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a00 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10a10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10a20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
10a30 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
10a40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
10a50 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b  * Last freeblock
10a60 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61   extends past pa
10a70 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
10a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10a90 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10ab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10ac0 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
10ad0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10ae0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
10af0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10b00 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b10 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
10b20 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10b30 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10b40 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b50 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10b60 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10b70 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10b80 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10b90 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10ba0 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10bb0 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10bc0 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
10bd0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
10be0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10bf0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10c00 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
10c10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
10c20 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10c30 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10c40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10c50 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10c80 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
10c90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10ca0 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
10cb0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
10cc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
10cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
10cf0 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
10d00 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
10d10 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
10d20 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
10d30 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
10d50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
10d60 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
10d70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10d80 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10d90 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
10da0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
10db0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
10dc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10dd0 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
10de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10df0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
10e00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10e10 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
10e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10e30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
10e40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10e50 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10e60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10e80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10e90 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10eb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10ec0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10ed0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10ef0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10f00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10f10 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10f20 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10f30 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10f40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10f50 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10f60 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10f70 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10f80 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10f90 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10fa0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10fb0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10fc0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10fd0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10fe0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10ff0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
11000 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
11010 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
11020 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
11030 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
11040 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11050 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
11060 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
11070 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
11080 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
11090 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
110a0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
110b0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
110c0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
110d0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
110e0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
110f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11100 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
11110 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
11120 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
11130 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
11140 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
11150 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
11160 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
11170 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
11180 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
11190 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
111a0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
111b0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
111c0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
111d0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
111e0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
111f0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
11200 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
11210 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
11220 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
11230 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
11240 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11250 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11270 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11280 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
11290 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
112a0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
112b0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
112c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
112d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
112e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
112f0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
11300 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
11310 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
11320 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
11330 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
11340 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11350 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
11360 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11370 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
11380 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
11390 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
113a0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
113b0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
113c0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
113d0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
113e0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
113f0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
11400 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
11410 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
11420 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
11430 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
11440 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
11450 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
11460 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
11470 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
11480 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
11490 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
114a0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
114b0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
114c0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
114d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
114e0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
114f0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
11500 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
11510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
11520 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
11530 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
11540 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
11550 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
11560 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
11570 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
11580 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
11590 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
115a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
115b0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
115c0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
115d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
115e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
115f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11600 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
11610 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
11620 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11630 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
11640 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
11650 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
11660 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
11670 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
11680 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
11690 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
116a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
116b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
116c0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
116d0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
116e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
116f0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
11700 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
11710 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11730 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11750 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
11760 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
11770 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
11780 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
117a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
117b0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
117c0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
117d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
117f0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
11800 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11810 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
11820 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
11830 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11840 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
11850 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
11860 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11870 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11880 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11890 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
118a0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
118b0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
118c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
118d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
118e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
118f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
11920 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
11930 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
11940 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
11950 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
11960 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
11970 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
11980 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
11990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
119a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
119b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
119c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119d0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
119e0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
119f0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
11a00 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
11a10 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
11a20 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
11a30 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
11a40 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
11a50 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
11a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
11a70 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
11a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a90 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
11aa0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
11ab0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
11ac0 65 29 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d  e)&0x80000000)==
11ad0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
11ae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
11af0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
11b00 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11b10 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11b20 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11b30 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11b40 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11b50 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11b60 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11b70 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11b80 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11b90 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11ba0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
11bb0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
11bc0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
11bd0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
11be0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
11bf0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
11c00 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11c10 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11c20 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11c30 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11c40 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11c50 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11c60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11c70 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11c80 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11c90 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11ca0 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
11cb0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
11cc0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
11cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ce0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
11cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11d20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11d30 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11d50 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11d60 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11d70 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d90 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11da0 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
11db0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
11de0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
11df0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
11e00 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e20 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11e30 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11e50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11e80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11e90 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11ea0 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50  pPage==&pCur->pP
11eb0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11ec0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61   pCur==0 || bRea
11ed0 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72  dOnly==pCur->cur
11ee0 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20  PagerFlags );.  
11ef0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11f00 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  || pCur->iPage>0
11f10 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
11f20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11f30 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
11f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11f50 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  KPT;.    goto ge
11f60 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11f70 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  or;.  }.  rc = s
11f80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
11f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11fa0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
11fb0 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
11fc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12000 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12010 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12020 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12030 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12040 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12050 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12060 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12070 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12080 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12090 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
120b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
120c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
120d0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
120e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
120f0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
12100 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
12110 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
12120 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
12130 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
12140 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
12150 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
12160 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
12170 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
12180 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
12190 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
121a0 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
121b0 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
121c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
121d0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
121e0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
121f0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
12200 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
12210 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12220 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
12230 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  gno);.    releas
12240 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12250 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12260 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12270 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12280 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12290 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
122a0 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
122b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
122c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
122d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
122e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a  ur->iPage];.  }.
122f0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12300 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12310 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12340 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12350 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12360 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12370 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12380 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12390 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
123a0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
123b0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
123c0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
123d0 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
123e0 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
123f0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12400 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
12410 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12420 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12430 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12440 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
12470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12480 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
124a0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
124b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
124d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
124f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12500 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12510 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12520 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12530 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
12540 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
12550 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12560 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
12570 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
12580 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
12590 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
125a0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
125b0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
125c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
125d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
125e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
125f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
12600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12610 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
12620 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
12630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12650 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12660 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
12670 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12680 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12690 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
126a0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
126b0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
126c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
126e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
126f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
12700 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
12710 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
12720 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
12730 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
12740 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
12750 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
12760 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
12770 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
12780 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
12790 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
127a0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
127b0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
127c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
127d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
127e0 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
127f0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
12800 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
12810 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
12820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12830 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
12840 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12850 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12860 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12870 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12890 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
128a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
128b0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
128c0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
128d0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
128e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
128f0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12900 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12910 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12920 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12930 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12940 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
12950 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
12980 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
12990 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
129a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
129b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
129c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
129d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
129e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
129f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12a00 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
12a10 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
12a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12a30 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
12a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12a50 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
12a60 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
12a70 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
12a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
12a90 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
12aa0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
12ab0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
12ac0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12ad0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
12ae0 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
12af0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
12b00 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
12b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12b20 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
12b30 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
12b40 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
12b50 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
12b60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
12b70 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
12b80 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
12b90 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
12ba0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
12bb0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
12bc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12bd0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
12be0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
12bf0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12c00 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12c20 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12c30 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
12c40 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
12c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12c70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12c80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
12c90 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
12ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12cb0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12cc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
12cd0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
12ce0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
12cf0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
12d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
12d10 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
12d20 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
12d30 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
12d40 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
12d50 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
12d60 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
12d70 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
12d80 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
12d90 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
12da0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
12db0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
12dc0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
12dd0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
12de0 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
12df0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
12e00 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
12e10 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
12e20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
12e30 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
12e40 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
12e50 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
12e60 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
12e70 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
12e80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12e90 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
12ea0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
12eb0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
12ec0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
12ed0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
12ee0 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
12ef0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
12f00 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
12f10 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
12f20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12f40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12f50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12f60 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12f70 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
12f80 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
12fc0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
12fd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
12fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
12ff0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
13000 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
13010 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13020 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13030 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
13040 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13050 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
13060 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13070 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
13080 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
13090 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
130a0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
130b0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
130c0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
130d0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
130e0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
130f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13100 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
13110 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13120 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
13130 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13140 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
13150 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
13160 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
13170 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
13180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13190 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
131a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
131b0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
131c0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
131d0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
131e0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
131f0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
13200 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
13210 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
13220 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13230 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
13240 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
13250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13260 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
13270 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
13280 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
13290 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
132a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
132b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
132c0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
132d0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
132e0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
132f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
13300 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13310 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
13320 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
13330 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
13340 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
13350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
13360 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13370 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
13380 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
13390 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
133a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
133b0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
133c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
133d0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
133e0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
133f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
13410 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
13420 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
13430 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
13440 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13450 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
13460 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
13470 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13490 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
134a0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
134b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
134c0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
134d0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
134e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
134f0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
13500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
13510 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
13520 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
13530 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
13560 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
13570 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
13580 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
13590 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
135a0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
135b0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
135c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
135d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
135e0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
135f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
13600 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13620 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
13630 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
13640 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
13650 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
13660 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
13670 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
13680 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
13690 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
136a0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
136b0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
136c0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
136d0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
136e0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
136f0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
13700 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
13710 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
13720 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
13730 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
13740 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
13750 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
13760 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
13770 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13780 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
13790 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
137a0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
137b0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
137c0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
137d0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
137e0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
13810 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
13820 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
13850 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
13860 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
13870 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
13880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
13890 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
138a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
138b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
138c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
138d0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
138e0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
138f0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
13900 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
13910 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13920 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
13930 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
13940 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
13950 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
13960 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
13970 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
13980 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
13990 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
139a0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
139b0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
139c0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
139d0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
139e0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
139f0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
13a00 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
13a10 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
13a20 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
13a30 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
13a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13a50 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
13a60 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
13a70 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
13a80 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
13a90 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
13aa0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
13ab0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
13ac0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
13ad0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
13ae0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
13af0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
13b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13b10 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
13b20 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
13b30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
13b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13b60 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
13b70 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
13b80 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
13b90 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
13ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13bb0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13bd0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
13be0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
13bf0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
13c00 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
13c10 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
13c20 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
13c30 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
13c40 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
13c50 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
13c60 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
13c70 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
13c80 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
13c90 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
13ca0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
13cb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13cc0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
13cd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
13ce0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
13cf0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
13d00 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
13d10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
13d20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13d30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
13d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
13d50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
13d60 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
13d70 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
13d80 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
13d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
13da0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
13db0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
13dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
13dd0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
13de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13df0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
13e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13e10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
13e30 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13e40 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
13e50 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
13e60 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
13e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e90 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
13ea0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
13ee0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
13ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f40 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
13f70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f80 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
13f90 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
13fa0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13fb0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
13fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13fd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13fe0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
13ff0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14000 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14010 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14020 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
14030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14040 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14060 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
14070 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14080 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14090 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
140a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
140b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
140c0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
140d0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
140e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
140f0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
14100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14110 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14120 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
14130 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
14140 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
14150 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14160 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
14170 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
14180 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
14190 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
141a0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
141b0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
141c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
141d0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
141e0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
141f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14210 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14240 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14260 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14270 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14290 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
142a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
142b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
142c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142e0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
142f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
14300 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14330 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14340 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14350 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
14360 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14370 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
14380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14390 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
143a0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
143b0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
143c0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
143d0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
143e0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
143f0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
14400 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
14410 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
14420 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
14430 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
14440 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
14450 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
14460 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
14470 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
14480 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
14490 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
144a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
144b0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
144c0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
144d0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
144e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
144f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14500 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
14510 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
14520 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
14530 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
14540 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
14550 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
14560 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
14570 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
14580 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
14590 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
145a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
145b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
145c0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
145d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
145e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
145f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14600 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
14610 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14620 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
14630 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14640 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
14650 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
14660 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
14670 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
14680 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
14690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
146b0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
146c0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
146d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
146e0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
146f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
14700 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
14730 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
14740 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
14750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
14780 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
14790 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
147a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
147b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
147c0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
147d0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
147e0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
147f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14810 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
14820 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14830 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
14840 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
14850 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
14860 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
14870 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
14880 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
14890 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
148a0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
148b0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
148c0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
148d0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
148e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
148f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
14900 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
14910 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
14920 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14930 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
14940 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14950 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
14960 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14970 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14980 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
14990 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
149a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
149b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
149c0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
149d0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
149e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
149f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
14a00 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
14a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14a20 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
14a30 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
14a40 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
14a50 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
14a60 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
14a70 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
14a80 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
14a90 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
14aa0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14ab0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
14ac0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
14ad0 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
14ae0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
14af0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
14b00 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14b10 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
14b20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
14b30 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
14b40 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
14b50 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
14b60 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
14b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14b80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
14b90 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
14ba0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
14bb0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
14bc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14bd0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
14be0 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
14bf0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
14c00 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
14c10 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
14c20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
14c30 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
14c40 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
14c50 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
14c60 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
14c70 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
14c80 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
14c90 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
14ca0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
14cb0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
14cc0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
14cd0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
14ce0 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
14cf0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
14d00 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
14d10 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
14d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
14d30 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
14d40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d50 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
14d60 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
14d70 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
14d80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14d90 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
14da0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14db0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
14dc0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
14dd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
14de0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
14df0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
14e00 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
14e10 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
14e20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14e30 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
14e40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
14e50 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
14e60 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
14e70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14e80 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
14e90 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
14ea0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
14eb0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
14ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14ed0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ef0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14f00 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14f10 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f20 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
14f30 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
14f40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14f50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
14f60 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
14f70 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
14f80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
14f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14fa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14fb0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14fc0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14fd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
14fe0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14ff0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15000 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
15010 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
15020 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
15030 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
15040 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
15050 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
15060 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
15070 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15080 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15090 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
150a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
150b0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
150c0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
150d0 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
150e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
150f0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
15100 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
15110 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
15120 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15130 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15140 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15150 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
15160 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
15170 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
15180 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15190 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
151a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
151b0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
151c0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
151d0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
151e0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
151f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
15200 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
15210 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15220 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
15230 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
15240 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
15250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15260 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
15280 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
152b0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
152c0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
152d0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
152e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
152f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15300 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
15310 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15320 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15330 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
15340 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15350 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15360 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15370 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
15380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15390 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
153a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
153b0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
153c0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
153d0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
153e0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
153f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
15400 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
15410 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
15420 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
15430 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
15440 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
15450 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
15460 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
15470 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
15480 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
15490 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
154a0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
154b0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
154c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
154d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
154e0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
154f0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
15500 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15510 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
15520 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
15530 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
15540 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
15550 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
15560 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
15570 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15580 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
15590 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
155a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
155b0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
155e0 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
155f0 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
15600 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
15610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
15620 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
15630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15640 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15650 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
15660 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
15670 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
15680 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
15690 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
156a0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
156b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
156c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
156d0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
156f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15700 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15710 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
15720 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
15730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15740 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15750 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
15760 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
15770 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
15780 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
15790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
157a0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
157b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
157c0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
157d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
157e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
157f0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
15800 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
15810 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
15820 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
15830 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
15840 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
15850 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
15860 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
15870 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
15880 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
15890 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
158a0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
158b0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
158c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
158d0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
158e0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
158f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15900 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
15910 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
15920 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
15930 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
15940 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
15950 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
15960 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15970 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
15980 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
15990 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
159a0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
159b0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
159c0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
159d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
159e0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
159f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15a00 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
15a10 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
15a20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15a30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
15a40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
15a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
15a60 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
15a70 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
15a80 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
15a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15aa0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15ab0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15ac0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15ad0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15ae0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15af0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15b00 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
15b10 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
15b20 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
15b30 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
15b40 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
15b50 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
15b60 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15b70 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15b80 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15b90 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15ba0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15bc0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15bd0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15be0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15bf0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15c00 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
15c10 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
15c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15c30 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
15c40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
15c50 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15c60 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15c70 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c80 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15c90 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15ca0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15cb0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15cc0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15cd0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15ce0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15cf0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15d00 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
15d10 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
15d20 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d30 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d40 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
15d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d60 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15d70 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d80 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d90 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15da0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15db0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15dc0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15dd0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15de0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15df0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15e00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15e10 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15e20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15e40 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15e50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15e60 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15e70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15e80 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15ea0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15eb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15ec0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15ed0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15ef0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15f00 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15f10 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15f20 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15f30 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
15f40 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
15f50 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
15f60 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
15f70 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
15f80 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
15f90 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15fa0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
15fb0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15fc0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
15fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
15fe0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
15ff0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16000 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
16010 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
16020 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
16030 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16040 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16050 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16060 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16070 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16080 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16090 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
160a0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
160b0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
160c0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
160d0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
160e0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
160f0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
16100 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
16110 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
16120 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
16130 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16140 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16150 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16160 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16170 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16180 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16190 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
161a0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
161b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
161c0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
161d0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
161e0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
161f0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
16200 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
16210 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
16220 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
16230 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16240 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16250 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16260 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16270 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16280 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
162a0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
162b0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
162c0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
162d0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
162e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
162f0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
16300 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
16310 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
16320 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
16330 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16340 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16360 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16370 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16380 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16390 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
163a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
163c0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
163d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
163e0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
163f0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16400 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
16410 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
16420 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16430 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16440 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16450 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16460 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16470 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16480 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16490 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
164a0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
164b0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
164c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
164d0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
164e0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
164f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16500 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
16510 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
16520 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
16530 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16540 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
16550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16560 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16570 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16580 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16590 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
165a0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
165b0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
165c0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
165d0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
165e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
165f0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
16600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16610 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
16620 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
16630 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
16640 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
16650 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
16660 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16670 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16680 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16690 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
166a0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
166b0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
166c0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
166d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
166e0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
166f0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
16700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16710 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16720 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
16730 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
16740 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16750 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
16760 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16770 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16780 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16790 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
167a0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
167b0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
167c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
167d0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
167e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
167f0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
16800 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
16810 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
16820 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
16830 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
16840 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
16850 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
16860 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16870 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16880 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16890 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
168a0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
168b0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
168c0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
168d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
168e0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
168f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
16900 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
16910 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
16920 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
16930 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
16940 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
16950 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
16960 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
16970 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16980 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
16990 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
169a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
169b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
169c0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
169d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
169e0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
169f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16a00 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
16a10 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
16a20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
16a30 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
16a40 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16a50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
16a60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
16a70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
16a80 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
16a90 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ab0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16ac0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
16ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16ae0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
16af0 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
16b00 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
16b10 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
16b20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
16b30 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
16b40 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
16b50 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
16b60 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
16b70 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
16b80 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
16b90 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
16ba0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
16bb0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
16bc0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
16bd0 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
16be0 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
16bf0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
16c00 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
16c10 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16c30 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
16c40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16c50 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16c60 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16c70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16c80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
16c90 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
16ca0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16cc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ce0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16cf0 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
16d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16d10 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16d20 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
16d30 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
16d40 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
16d50 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
16d60 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
16d70 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
16d80 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
16d90 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
16da0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
16db0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
16dc0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
16dd0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16de0 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
16df0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
16e00 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
16e10 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
16e20 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
16e30 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16e40 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
16e50 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
16e60 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
16e70 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
16e80 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
16e90 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
16ea0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
16eb0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
16ec0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
16ed0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16ee0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
16ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f30 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
16f40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
16f50 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
16f60 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16f80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16f90 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
16fa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
16fb0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
16fc0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
16fd0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
16fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
16ff0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
17000 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
17010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17020 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
17030 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
17040 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
17050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17060 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17080 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17090 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
170a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
170b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
170c0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
170d0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
170e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
170f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17110 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
17120 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
17130 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17140 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
17150 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
17160 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
17170 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
17180 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
17190 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
171a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
171b0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
171c0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
171d0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
171e0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
171f0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
17200 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
17210 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
17220 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17230 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
17240 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
17250 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
17260 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
17270 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17280 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
17290 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
172a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
172b0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
172c0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
172d0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
172e0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
172f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17300 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17310 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17320 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
17330 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
17340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17350 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
17360 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
17370 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
17380 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
17390 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
173a0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
173b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
173c0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
173d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
173e0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
173f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17400 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
17410 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
17420 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
17430 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
17440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17460 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
17470 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17480 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
17490 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
174a0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
174b0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
174c0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
174d0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
174e0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17500 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
17510 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
17520 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
17530 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
17540 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
17550 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
17560 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
17570 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
17580 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
17590 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
175a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
175b0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
175c0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
175d0 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
175e0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
175f0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
17600 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
17610 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
17620 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
17630 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
17640 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
17650 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
17660 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
17670 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
17680 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
17690 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
176a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
176b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
176c0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
176d0 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
176e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
176f0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
17700 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
17710 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
17720 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
17730 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
17740 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
17750 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
17760 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
17770 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
17780 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
17790 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
177a0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
177b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
177c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
177d0 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
177e0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
177f0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
17800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17820 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17830 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
17840 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
17850 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
17860 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
17870 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17880 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
17890 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
178a0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
178b0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
178c0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
178d0 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
178e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
178f0 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
17900 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17910 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17930 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
17940 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
17950 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
17960 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17970 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
17980 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
17990 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
179a0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
179b0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
179c0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
179d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
179e0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
179f0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
17a00 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
17a10 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
17a20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
17a30 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
17a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
17a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
17a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
17a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
17a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
17af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
17b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
17b10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b20 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17b30 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
17b40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17b60 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
17b70 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
17b80 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
17b90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
17ba0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
17bb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
17bc0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
17bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17be0 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
17bf0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
17c00 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
17c10 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
17c20 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
17c30 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
17c40 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
17c50 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
17c60 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
17c70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
17c80 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
17c90 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
17ca0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
17cb0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
17cc0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
17cd0 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
17ce0 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
17cf0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
17d00 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17d10 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
17d20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
17d30 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
17d40 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
17d50 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
17d60 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
17d70 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
17d80 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
17d90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17da0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
17db0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
17dc0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
17dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17de0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
17df0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
17e00 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
17e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e20 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
17e30 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
17e40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
17e50 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
17e60 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
17e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17e80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17e90 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
17ea0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
17eb0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
17ec0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
17ed0 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
17ee0 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
17ef0 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
17f00 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
17f10 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
17f20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
17f30 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
17f40 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
17f50 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
17f60 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
17f70 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
17f80 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
17f90 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
17fa0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
17fb0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
17fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fd0 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
17fe0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
17ff0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18000 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18010 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
18020 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18030 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
18040 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18050 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
18060 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18070 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
18080 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
18090 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
180a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180b0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
180c0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
180d0 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
180e0 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
180f0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
18100 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
18110 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
18120 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
18130 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
18140 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
18150 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
18160 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
18170 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
18180 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
18190 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
181a0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
181b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
181c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
181d0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
181e0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
181f0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
18200 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
18210 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18220 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18230 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18240 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
18250 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18260 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
18270 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
18280 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
18290 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
182a0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
182b0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
182c0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
182d0 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
182e0 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
182f0 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
18300 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
18310 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18320 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
18330 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
18340 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
18350 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
18360 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
18370 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
18380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18390 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
183a0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
183b0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
183c0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
183d0 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
183e0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
183f0 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
18400 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
18410 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18420 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
18430 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
18440 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
18450 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
18460 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
18470 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
18480 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
18490 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
184a0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
184b0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
184c0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
184d0 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
184e0 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
184f0 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
18500 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
18510 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
18520 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
18530 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
18540 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
18550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18560 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
18570 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
18580 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18590 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
185a0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
185b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
185c0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
185d0 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
185e0 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
185f0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
18600 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
18610 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
18620 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
18630 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18640 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18650 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18660 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
18670 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
18680 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
18690 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
186a0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
186b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
186c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
186d0 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
186e0 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
186f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18700 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
18710 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
18720 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18730 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
18740 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
18750 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
18760 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
18770 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
18780 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
18790 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
187a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
187b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
187c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
187d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
187e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
187f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
18800 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
18810 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
18820 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
18830 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18840 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
18850 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
18860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18870 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
18880 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
18890 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
188a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
188b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
188d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
188e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
188f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
18900 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18910 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
18920 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
18930 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
18940 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
18950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
18970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
18980 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
18990 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
189a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
189b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
189c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
189d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
189e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
189f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
18a00 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
18a10 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
18a20 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
18a30 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
18a40 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
18a50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18a60 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18a70 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
18a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18a90 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
18aa0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18ab0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
18ac0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
18ad0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18ae0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
18af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18b00 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
18b10 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
18b20 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
18b30 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b40 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
18b50 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
18b60 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
18b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
18b90 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
18ba0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
18bb0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
18bc0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
18bd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18be0 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
18bf0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
18c00 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
18c10 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
18c20 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
18c30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
18c40 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
18c50 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
18c60 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
18c70 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
18c80 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18c90 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
18ca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18cb0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
18cc0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
18cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
18ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
18cf0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
18d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
18d10 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
18d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d30 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
18d40 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
18d50 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
18d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
18d70 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18d80 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18d90 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18da0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
18db0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
18dc0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18dd0 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
18de0 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
18df0 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
18e00 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
18e20 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
18e30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
18e40 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
18e50 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
18e60 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18e70 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18e80 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18e90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
18ea0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18eb0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18ec0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
18ed0 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
18ee0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
18ef0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
18f00 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
18f10 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
18f20 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
18f30 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
18f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18f50 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
18f60 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
18f70 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
18f80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
18f90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18fa0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
18fb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
18fc0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
18fd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
18fe0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
18ff0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
19000 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
19010 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19020 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19030 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
19040 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
19050 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
19060 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
19070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
19080 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
19090 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
190c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
190d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
190e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
190f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
19100 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
19110 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
19120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19130 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19140 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
19150 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
19160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19170 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19180 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
19190 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
191a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
191b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
191c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
191d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
191e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
191f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19210 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
19220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19230 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
19240 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
19250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19260 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19270 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19280 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
19290 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
192b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
192c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
192d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
192e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
192f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
19300 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
19310 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
19320 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
19330 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
19340 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19350 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
19360 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
19370 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
19380 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
19390 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
193a0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
193b0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
193c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
193d0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
193e0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
193f0 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
19400 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
19410 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
19420 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
19430 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
19440 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
19450 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
19460 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
19470 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
19480 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
19490 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
194a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
194b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
194c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
194d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
194e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
194f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
19500 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
19510 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
19520 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
19530 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
19540 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
19550 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
19560 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
19570 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
19580 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
19590 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
195a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
195b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
195c0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
195d0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
195e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
195f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19610 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
19620 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19630 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19640 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
19650 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
19660 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
19670 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
19680 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
19690 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
196a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
196b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
196c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
196d0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
196e0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
196f0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
19700 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
19710 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
19720 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
19730 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
19740 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
19750 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
19760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
19770 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
19780 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
19790 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
197a0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
197b0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
197c0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
197d0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
197e0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
197f0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
19800 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
19810 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
19820 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
19830 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
19840 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
19850 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
19860 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
19870 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
19880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
19890 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
198a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
198b0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
198c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
198d0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
198e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
198f0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
19900 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
19910 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19930 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19940 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19960 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
19970 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
19980 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
19990 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
199a0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
199b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
199c0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
199d0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
199e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
199f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
19a00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19a10 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
19a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a30 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19a40 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
19a50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
19a60 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
19a70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
19a80 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
19a90 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
19aa0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
19ab0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
19ac0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
19ad0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
19ae0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
19af0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
19b00 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
19b10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19b20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
19b30 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
19b40 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
19b50 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
19b60 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
19b70 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
19b80 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
19b90 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
19ba0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
19bb0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
19bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
19bd0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19be0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
19bf0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c00 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
19c10 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
19c20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19c30 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
19c40 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
19c50 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
19c60 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
19c70 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
19c80 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
19c90 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
19ca0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
19cb0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
19cc0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
19cd0 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
19ce0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19cf0 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
19d00 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
19d10 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
19d20 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
19d30 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19d40 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
19d50 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
19d60 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
19d70 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
19d80 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
19d90 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
19da0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
19db0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
19dc0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19dd0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19de0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
19df0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
19e00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19e10 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
19e20 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
19e30 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
19e40 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
19e50 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
19e60 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
19e70 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
19e80 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
19e90 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
19ea0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
19eb0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
19ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
19ed0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
19ee0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
19ef0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
19f00 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
19f10 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
19f20 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
19f30 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
19f40 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
19f50 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
19f60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19f70 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
19f80 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
19f90 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
19fa0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
19fb0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
19fc0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19fd0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
19fe0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
19ff0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1a000 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1a010 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1a020 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1a030 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1a040 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1a050 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1a060 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1a070 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1a080 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1a090 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1a0a0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1a0b0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1a0c0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1a0d0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1a0e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1a0f0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1a100 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1a110 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1a120 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1a130 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a140 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1a150 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a160 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1a170 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a180 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1a190 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1a1a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a1b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1a1c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1a1d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1a210 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1a220 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a230 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
1a240 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
1a250 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
1a260 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
1a270 30 0a 20 20 20 20 20 26 26 20 6e 50 61 67 65 3e  0.     && nPage>
1a280 6e 50 61 67 65 46 69 6c 65 0a 20 20 20 20 29 7b  nPageFile.    ){
1a290 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a2a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a2b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a2c0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a2d0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
1a2e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
1a2f0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
1a300 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
1a310 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
1a320 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
1a330 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
1a340 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
1a350 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
1a360 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
1a370 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
1a380 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
1a390 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
1a3a0 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
1a3b0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
1a3c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a3d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
1a3e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
1a3f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
1a400 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
1a410 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
1a420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a430 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
1a440 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
1a450 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1a460 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
1a470 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
1a480 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1a490 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
1a4a0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
1a4b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
1a4c0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
1a4d0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
1a4e0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
1a4f0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
1a500 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
1a510 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
1a520 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
1a530 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
1a540 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
1a550 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
1a560 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
1a570 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
1a580 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
1a590 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
1a5a0 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
1a5b0 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
1a5c0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
1a5d0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
1a5e0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
1a5f0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
1a600 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
1a610 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1a620 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
1a630 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
1a640 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
1a650 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
1a660 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
1a670 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
1a680 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
1a690 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
1a6a0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
1a6b0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
1a6c0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
1a6d0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
1a6e0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
1a6f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
1a700 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
1a710 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
1a720 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1a730 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
1a740 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
1a750 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1a760 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1a770 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1a780 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
1a790 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a7a0 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
1a7b0 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
1a7c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1a7d0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1a7e0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
1a7f0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
1a800 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
1a810 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
1a820 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
1a830 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
1a840 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
1a850 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
1a860 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
1a870 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
1a880 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
1a890 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
1a8a0 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
1a8b0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1a8c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
1a8d0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a8e0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f  :.  releasePageO
1a8f0 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ne(pPage1);.  pB
1a900 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1a910 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a920 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1a930 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a940 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1a950 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1a960 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1a970 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1a980 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1a990 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1a9a0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1a9b0 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1a9c0 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1a9d0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a9e0 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1a9f0 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1aa00 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1aa10 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1aa20 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1aa30 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1aa40 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1aa50 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1aa60 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1aa70 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1aa80 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1aa90 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1aaa0 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1aab0 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1aac0 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1aad0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1aae0 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1aaf0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ab00 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1ab10 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1ab20 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1ab30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1ab40 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1ab50 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1ab60 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1ab70 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1ab80 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1ab90 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1aba0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1abb0 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1abc0 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1abd0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1abe0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1abf0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1ac00 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1ac10 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1ac20 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1ac30 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1ac40 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1ac50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1ac60 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1ac70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ac80 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1ac90 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1aca0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1acb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1acc0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1acd0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1ace0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1acf0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1ad00 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1ad10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1ad20 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1ad30 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1ad40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ad50 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1ad60 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1ad70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1ad80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ad90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1ada0 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1adb0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1adc0 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1add0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1ade0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1adf0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1ae00 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1ae10 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1ae20 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1ae30 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1ae40 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1ae50 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1ae60 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1ae70 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1ae80 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1ae90 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1aea0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1aeb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
1aec0 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
1aed0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
1aee0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
1aef0 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
1af00 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
1af10 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
1af20 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
1af30 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
1af40 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1af50 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1af60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1af70 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
1af80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
1af90 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
1afa0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
1afb0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
1afc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1afd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1afe0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
1aff0 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
1b000 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b010 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
1b020 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1b030 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
1b040 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
1b050 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
1b060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1b070 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
1b080 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1b090 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
1b0a0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
1b0b0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
1b0c0 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
1b0d0 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
1b0e0 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
1b0f0 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
1b100 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1b110 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
1b120 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
1b130 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
1b140 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
1b150 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
1b160 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
1b170 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
1b180 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
1b190 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
1b1a0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
1b1b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
1b1c0 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
1b1d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
1b1e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
1b1f0 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
1b200 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
1b210 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
1b220 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
1b230 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
1b240 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
1b250 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
1b260 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
1b270 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
1b280 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
1b290 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
1b2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b2b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
1b2c0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1b2d0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
1b2e0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
1b2f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b300 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
1b310 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
1b320 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
1b330 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
1b340 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
1b350 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
1b360 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
1b370 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
1b380 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
1b390 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
1b3a0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
1b3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b3c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1b3d0 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
1b3e0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1b3f0 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
1b400 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
1b410 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
1b420 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
1b430 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
1b440 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
1b450 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
1b460 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1b470 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1b480 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
1b490 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1b4a0 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
1b4b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1b4c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b4d0 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
1b4e0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
1b4f0 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
1b500 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b510 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b530 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
1b540 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1b550 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
1b560 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
1b570 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
1b580 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1b590 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
1b5a0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
1b5b0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
1b5c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b5d0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
1b5e0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
1b5f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b600 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
1b610 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
1b620 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
1b630 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
1b640 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
1b650 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1b660 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1b670 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1b680 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1b690 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1b6a0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1b6b0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1b6c0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1b6d0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1b6e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1b6f0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1b700 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1b710 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1b720 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1b730 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1b740 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1b750 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b760 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1b770 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1b780 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1b790 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1b7a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1b7b0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1b7c0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1b7d0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1b7e0 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1b7f0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1b800 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b810 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1b820 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1b830 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1b840 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1b850 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1b860 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b870 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1b880 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1b890 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1b8a0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1b8b0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1b8c0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1b8d0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1b8e0 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1b8f0 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1b900 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1b910 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1b920 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1b930 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1b940 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1b950 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1b960 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1b970 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1b980 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1b990 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1b9a0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1b9b0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1b9c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1b9d0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1b9e0 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1b9f0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1ba00 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1ba10 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1ba20 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1ba30 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1ba40 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1ba50 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1ba60 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1ba70 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1ba80 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1ba90 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1baa0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1bab0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1bac0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1bad0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1bae0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1baf0 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1bb00 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1bb10 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1bb20 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1bb30 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1bb40 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1bb50 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1bb60 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1bb70 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1bb80 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1bb90 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1bba0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1bbb0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1bbc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bbd0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1bbe0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1bbf0 67 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d 61 56  g, int *pSchemaV
1bc00 65 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53 68 61  ersion){.  BtSha
1bc10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1bc20 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1bc30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
1bc40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bc50 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1bc60 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1bc70 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
1bc80 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
1bc90 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
1bca0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
1bcb0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
1bcc0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
1bcd0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
1bce0 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
1bcf0 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
1bd00 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1bd10 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bd20 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
1bd30 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
1bd40 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
1bd50 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1bd60 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
1bd70 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1bd80 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1bd90 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
1bda0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
1bdb0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  cate)==0 );..  i
1bdc0 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  f( (p->db->flags
1bdd0 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44   & SQLITE_ResetD
1bde0 61 74 61 62 61 73 65 29 20 0a 20 20 20 26 26 20  atabase) .   && 
1bdf0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
1be00 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
1be10 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  er)==0 .  ){.   
1be20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1be30 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  = ~BTS_READ_ONLY
1be40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1be50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1be60 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1be70 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1be80 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1be90 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bea0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1beb0 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1bec0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bed0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1bee0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bef0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1bf00 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1bf10 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1bf20 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1bf30 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1bf40 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1bf50 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1bf60 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1bf70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1bf80 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1bf90 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1bfa0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1bfb0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1bfc0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1bfd0 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1bfe0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1bff0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1c000 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1c010 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1c020 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1c030 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1c040 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1c050 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1c060 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1c070 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1c080 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1c090 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1c0a0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1c0b0 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1c0c0 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1c0d0 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1c0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1c0f0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1c100 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1c110 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1c120 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1c130 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c140 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c150 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1c160 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1c170 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1c180 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1c190 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c1a0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1c1b0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1c1c0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1c1d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c1e0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1c1f0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1c200 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1c210 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1c220 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1c230 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1c240 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1c250 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1c260 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1c270 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1c280 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1c290 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1c2a0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1c2b0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1c2c0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1c2d0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1c2e0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1c2f0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1c300 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1c310 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1c320 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1c330 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1c340 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1c350 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c360 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1c370 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1c380 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1c390 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1c3a0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1c3b0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1c3c0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1c3d0 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1c3e0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1c3f0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1c400 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1c410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1c420 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1c430 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1c440 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1c450 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1c460 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1c470 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1c480 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1c490 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1c4a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1c4b0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1c4c0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1c4d0 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1c4e0 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1c4f0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1c500 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1c510 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1c520 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1c530 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1c540 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1c550 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1c560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c570 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1c580 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1c590 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1c5a0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1c5b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1c5c0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1c5d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1c5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1c5f0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1c600 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1c610 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1c620 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1c630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c650 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1c660 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
1c670 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c680 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 26  _BUSY_SNAPSHOT &
1c690 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1c6a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1c6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1c6c0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 6e 6f   if there was no
1c6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1c6e0 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ned when this fu
1c6f0 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20 20  nction was.     
1c700 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 61       ** called a
1c710 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  nd SQLITE_BUSY_S
1c720 4e 41 50 53 48 4f 54 20 69 73 20 72 65 74 75 72  NAPSHOT is retur
1c730 6e 65 64 2c 20 63 68 61 6e 67 65 20 74 68 65 20  ned, change the 
1c740 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c750 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c 49 54  ** code to SQLIT
1c760 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20 20 20  E_BUSY. */.     
1c770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c780 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
1c790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c7a0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7c0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1c7d0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
1c7e0 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
1c7f0 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
1c800 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
1c810 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1c820 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
1c830 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
1c840 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
1c850 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
1c860 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28 70  setLockTimeout(p
1c870 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
1c880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c890 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1c8a0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c8b0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1c8c0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1c8d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c8e0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1c8f0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1c900 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1c910 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1c920 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1c930 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1c940 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1c950 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1c960 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1c970 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1c980 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1c990 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1c9a0 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1c9b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1c9c0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1c9d0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1c9e0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1c9f0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1ca00 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1ca10 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1ca20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1ca30 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1ca40 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1ca50 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1ca60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1ca70 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1ca80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ca90 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1caa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1cab0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1cac0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1cad0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1cae0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1caf0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1cb00 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1cb10 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1cb20 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1cb30 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1cb40 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1cb50 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1cb60 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1cb70 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1cb80 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1cb90 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1cba0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1cbb0 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1cbc0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1cbd0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1cbe0 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1cbf0 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1cc00 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1cc10 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1cc20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1cc30 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1cc40 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1cc50 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1cc60 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1cc70 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1cc80 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1cc90 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1cca0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1ccb0 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1ccc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ccd0 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1cce0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ccf0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1cd00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1cd10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cd20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1cd30 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1cd40 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1cd50 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1cd60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cd70 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62 65 67  }.  }..trans_beg
1cd80 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
1cd90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1cda0 66 28 20 70 53 63 68 65 6d 61 56 65 72 73 69 6f  f( pSchemaVersio
1cdb0 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 63 68  n ){.      *pSch
1cdc0 65 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67 65 74  emaVersion = get
1cdd0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1cde0 65 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a  e1->aData[40]);.
1cdf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1ce00 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a  flag ){.      /*
1ce10 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
1ce20 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
1ce30 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
1ce40 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
1ce50 20 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76       ** open sav
1ce60 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1ce70 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1ce80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1ce90 20 30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20   0 and.      ** 
1cea0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1ceb0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1cec0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1ced0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1cee0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1cf00 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1cf10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
1cf20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
1cf30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74  .    }.  }..  bt
1cf40 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1cf50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1cf60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1cf70 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1cf80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1cf90 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1cfa0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1cfb0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1cfc0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1cfd0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1cfe0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1cff0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1d000 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1d010 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1d020 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1d030 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1d040 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1d050 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1d060 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1d070 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1d080 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d0b0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1d0c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d0f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1d100 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1d110 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d140 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1d150 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1d160 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1d170 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1d180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d190 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1d1a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1d1b0 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69  .  rc = pPage->i
1d1c0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1d1d0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1d1e0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1d1f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1d210 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1d220 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1d230 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1d240 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1d250 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1d260 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1d270 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1d280 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1d290 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d2a0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1d2b0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1d2c0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1d2d0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d2e0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1d2f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1d300 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d310 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1d320 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1d330 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1d340 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d350 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d360 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1d370 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1d380 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1d390 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1d3a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d3b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1d3c0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1d3d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d3e0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1d3f0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1d400 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1d410 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1d420 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1d430 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1d440 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1d450 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1d460 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1d470 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1d480 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1d490 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d4a0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d4b0 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d4d0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1d4e0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1d4f0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1d500 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d510 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d520 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1d530 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d540 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1d550 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1d560 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1d570 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d580 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1d590 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1d5a0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d5b0 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1d5c0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1d5d0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1d5e0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1d5f0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1d600 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1d610 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1d620 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1d630 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1d640 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1d650 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d660 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1d670 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d680 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1d690 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1d6a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1d6b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d6c0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1d6d0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1d6e0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1d6f0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1d700 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1d710 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1d720 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1d730 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1d740 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d750 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d760 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1d770 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1d780 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1d790 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1d7a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1d7b0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1d7c0 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61  c;..    rc = pPa
1d7d0 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c  ge->isInit ? SQL
1d7e0 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e  ITE_OK : btreeIn
1d7f0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1d800 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1d810 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1d820 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1d830 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1d840 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1d850 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1d860 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d870 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1d880 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d890 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1d8a0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1d8b0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1d8c0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1d8d0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1d8e0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1d8f0 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1d900 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
1d910 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66     if( pCell+inf
1d920 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d  o.nSize > pPage-
1d930 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42  >aData+pPage->pB
1d940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
1d950 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1d960 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1d970 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1d980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d990 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
1d9a0 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1d9b0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b  info.nSize-4) ){
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1d9d0 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1d9e0 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a  .nSize-4, iTo);.
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1da00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1da10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1da20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1da30 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1da40 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1da50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1da60 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1da70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1da80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1da90 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1daa0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1dab0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1dac0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1dad0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1dae0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1daf0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1db00 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1db10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1db20 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1db30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1db40 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1db50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1db60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1db70 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1db80 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1db90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1dba0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1dbb0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1dbc0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1dbd0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1dbe0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1dbf0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1dc00 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1dc10 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1dc20 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1dc30 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1dc40 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1dc50 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1dc60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1dc70 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1dc80 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1dc90 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1dca0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1dcb0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1dcc0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1dcd0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1dce0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1dcf0 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1dd00 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1dd10 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1dd20 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1dd30 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1dd40 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1dd50 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1dd60 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1dd70 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1dd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1dd90 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1dda0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1ddb0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1ddc0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1ddd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1dde0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1ddf0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1de00 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1de10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1de20 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1de30 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1de40 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1de50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1de60 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1de70 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1de80 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1de90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1dea0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1deb0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1dec0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1ded0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1dee0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1def0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1df00 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1df10 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1df20 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1df30 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1df40 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1df50 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1df60 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1df70 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1df80 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1df90 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1dfa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1dfb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1dfc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1dfd0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1dfe0 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62  pBt );.  if( iDb
1dff0 50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20  Page<3 ) return 
1e000 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e010 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  KPT;..  /* Move 
1e020 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1e030 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1e040 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1e050 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1e060 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1e070 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1e080 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1e090 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1e0a0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1e0b0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1e0c0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1e0d0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1e0e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1e0f0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1e100 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1e110 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1e120 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1e130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e150 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1e160 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1e170 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1e180 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1e190 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1e1a0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1e1b0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1e1c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1e1d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1e1e0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e1f0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1e200 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1e210 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1e220 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1e230 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1e240 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1e250 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1e260 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1e270 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1e280 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1e290 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1e2a0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1e2b0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1e2c0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1e2d0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1e2e0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1e2f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1e300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1e310 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1e320 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1e330 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e340 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e350 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e360 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e380 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e3a0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e3b0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e3c0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e3d0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e3e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e3f0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e400 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e410 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e440 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e460 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e470 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e480 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e490 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e4a0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e4b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e4c0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e4d0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e4e0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e4f0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e500 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e510 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e520 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e530 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e540 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e550 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e5a0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e5b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e5c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e5d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e5e0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e5f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e600 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e610 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e620 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e630 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e640 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e650 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e660 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e680 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e690 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e6a0 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e6b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e6c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e6d0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e6e0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e6f0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1e700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e710 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1e720 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1e730 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1e740 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1e750 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1e760 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1e770 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1e780 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1e790 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1e7a0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1e7b0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1e7c0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1e7d0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1e7e0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1e7f0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1e800 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1e810 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1e820 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1e830 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1e840 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1e850 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1e860 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1e870 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1e880 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1e890 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1e8a0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1e8b0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1e8c0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1e8d0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1e8e0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1e8f0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1e900 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1e910 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1e920 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1e930 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1e940 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1e950 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1e960 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1e970 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1e980 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1e990 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1e9a0 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1e9b0 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1e9c0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1e9d0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1e9e0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1e9f0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1ea00 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1ea10 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1ea20 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1ea30 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1ea40 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ea50 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1ea60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ea70 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1ea80 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1ea90 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1eaa0 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1eab0 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1eac0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1ead0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1eae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1eaf0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1eb00 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1eb10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1eb20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1eb30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1eb40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1eb50 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1eb60 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1eb70 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1eb80 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1eb90 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1eba0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1ebb0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1ebc0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1ebd0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1ebe0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1ebf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ec00 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1ec10 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1ec20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec30 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1ec40 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1ec50 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1ec60 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1ec70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ec80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1eca0 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1ecb0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1ecc0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ecd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ece0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1ecf0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1ed00 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1ed10 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1ed20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1ed30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1ed40 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1ed50 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1ed60 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ed70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1ed80 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1ed90 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1eda0 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1edb0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1edc0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1edd0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1ede0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1edf0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1ee00 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1ee10 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1ee20 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1ee30 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1ee40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ee50 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1ee60 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1ee70 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1ee80 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1ee90 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1eea0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1eeb0 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1eec0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1eed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1eee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1eef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ef00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1ef10 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1ef20 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1ef30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1ef40 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1ef50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1ef60 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef80 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1ef90 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1efa0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1efb0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1efc0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1efd0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1efe0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1eff0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f000 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1f010 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1f020 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f030 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1f040 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1f050 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1f060 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1f070 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1f080 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1f090 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f0a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f0b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f0c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f0d0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1f0e0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1f0f0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1f100 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1f110 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1f120 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1f130 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1f140 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1f150 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1f160 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1f170 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1f180 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1f190 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1f1a0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1f1b0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1f1c0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1f1d0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1f1e0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1f1f0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1f200 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1f210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f220 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1f230 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1f240 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1f250 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1f260 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1f270 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1f280 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f290 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f2a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f2b0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f2c0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1f2d0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1f2e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f300 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f310 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1f320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f330 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f340 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f350 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f360 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f370 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f380 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f390 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f3a0 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f3b0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f3c0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f3d0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f3e0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f3f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f400 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f420 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f430 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f440 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f450 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f460 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f470 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f480 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f490 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f4a0 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f4b0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f4c0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f4d0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f4e0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f4f0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f520 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f530 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f540 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f550 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f560 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f570 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f580 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f590 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f5a0 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f5b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f5c0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f5d0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f5e0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f5f0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f600 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f610 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f620 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f630 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f660 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f670 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f680 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f6a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f6b0 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f6c0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f6d0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f6f0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1f700 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1f710 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1f720 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1f730 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1f740 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1f750 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1f760 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1f770 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1f780 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1f790 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f7a0 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1f7b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f7c0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1f7d0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1f7e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f7f0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1f800 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f810 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1f820 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1f830 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1f840 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1f850 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1f860 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1f870 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1f880 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1f890 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1f8a0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1f8b0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1f8c0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1f8d0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1f8e0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1f8f0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1f900 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1f910 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1f920 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1f930 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1f940 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1f950 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1f960 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f970 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1f980 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f990 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1f9a0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1f9b0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1f9c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1f9d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f9e0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1f9f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1fa00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1fa10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1fa20 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1fa30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fa40 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1fa50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fa60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fa70 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1fa80 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1fa90 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1faa0 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1fab0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fac0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fad0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1fae0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1faf0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1fb00 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1fb10 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1fb20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fb30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fb40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1fb50 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1fb60 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fb70 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fb80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fba0 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1fbb0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1fbc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1fbd0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1fbe0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1fbf0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1fc00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fc10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1fc20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fc30 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1fc40 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1fc50 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1fc60 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fc70 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1fc80 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1fc90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1fca0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1fcb0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1fcc0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1fcd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fce0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1fcf0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1fd00 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1fd10 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1fd20 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1fd30 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1fd40 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1fd50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1fd60 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1fd70 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1fd80 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1fd90 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1fda0 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1fdb0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1fdc0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1fdd0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1fde0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1fdf0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1fe00 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1fe10 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1fe20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1fe30 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1fe40 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1fe50 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1fe60 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1fe70 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1fe80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1fe90 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1fea0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1feb0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1fec0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1fed0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1fee0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1fef0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ff00 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ff10 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1ff20 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1ff30 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1ff40 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1ff50 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1ff60 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1ff70 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1ff80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ff90 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1ffa0 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1ffb0 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1ffc0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1ffd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ffe0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1fff0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
20000 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
20010 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
20020 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
20030 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
20040 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
20050 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
20060 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
20070 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
20080 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20090 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
200a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
200b0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
200c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
200d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
200e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
200f0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
20100 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
20110 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
20120 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
20130 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
20140 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
20150 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
20160 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
20170 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
20180 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
20190 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
201a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
201b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
201c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
201d0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
201e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
201f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
20200 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
20210 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
20220 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
20230 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
20240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20250 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20260 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
20270 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
20280 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20290 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
202a0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
202b0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
202c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
202d0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
202e0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
202f0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
20300 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
20310 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
20320 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
20330 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20340 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20350 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20360 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20370 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20380 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20390 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
203a0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
203b0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
203c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
203d0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
203e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
203f0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
20400 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
20410 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
20420 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20430 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20440 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20460 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20470 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20480 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20490 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
204a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
204b0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
204c0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
204d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
204e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
204f0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
20500 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
20510 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
20520 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20530 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20540 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
20550 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20560 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20570 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20580 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20590 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
205a0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
205b0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
205c0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
205d0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
205e0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
205f0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
20600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
20610 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
20620 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
20630 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
20640 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
20650 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20660 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20670 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20680 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20690 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
206a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
206b0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
206c0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
206d0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
206e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
206f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
20700 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
20710 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
20720 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
20730 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20740 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
20750 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20760 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20770 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20780 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20790 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
207a0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
207b0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
207c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
207d0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
207e0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
207f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
20800 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
20810 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
20820 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20830 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20840 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20850 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20860 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20870 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20880 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20890 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
208a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
208b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
208c0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
208d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
208e0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
208f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
20900 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
20910 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
20920 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
20930 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20940 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20950 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20960 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20980 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20990 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
209a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
209b0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
209c0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
209d0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
209e0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
209f0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
20a00 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
20a10 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
20a20 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
20a30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20a40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20a50 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20a80 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20a90 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20aa0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20ab0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20ac0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20ad0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20ae0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
20af0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20b00 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20b10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
20b20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20b40 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20b50 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20b60 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20b70 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20bb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20bc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20bd0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20be0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20bf0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20c00 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20c10 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
20c20 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
20c30 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20c40 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20c50 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20c60 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20c70 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20c80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20c90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20cb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20cc0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20cd0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20ce0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20cf0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
20d00 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
20d10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
20d20 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
20d30 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
20d40 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
20d50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20d60 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
20d70 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20d80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20d90 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20da0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20db0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20dc0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
20dd0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
20de0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20df0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
20e00 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
20e10 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
20e20 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
20e30 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
20e40 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
20e50 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
20e60 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
20e70 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20e80 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20e90 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20ea0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20eb0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
20ec0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20ed0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
20ee0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
20ef0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
20f00 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
20f10 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
20f30 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
20f40 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
20f50 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
20f60 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
20f70 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20f80 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20f90 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20fa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20fb0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
20fc0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
20fd0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
20fe0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
20ff0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
21000 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
21010 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
21020 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
21030 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
21040 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
21050 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
21060 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21070 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21080 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
21090 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
210a0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
210b0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
210c0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
210d0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
210e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
210f0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
21100 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
21110 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
21120 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
21130 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
21140 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
21150 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
21160 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
21170 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
21180 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
21190 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
211a0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
211b0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
211c0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
211d0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
211e0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
211f0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
21200 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
21210 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21220 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
21230 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
21240 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
21250 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
21260 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21270 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
21280 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21290 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
212a0 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
212b0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
212c0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
212d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
212e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
212f0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
21300 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
21310 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
21320 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
21330 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
21340 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
21350 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21360 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21370 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21380 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21390 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
213a0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
213b0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
213c0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
213d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
213e0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
213f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
21400 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
21410 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
21420 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
21430 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21440 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
21450 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21460 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21470 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21480 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
214a0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
214b0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
214c0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
214d0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
214e0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
214f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
21500 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
21510 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
21520 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
21530 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
21540 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
21550 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21560 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21570 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21580 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21590 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
215a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
215b0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
215c0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
215d0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
215e0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
215f0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
21600 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
21610 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
21620 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
21630 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
21640 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
21650 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21660 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21670 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21680 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21690 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
216a0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
216b0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
216c0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
216d0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
216e0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
216f0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
21700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21710 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
21720 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
21730 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
21740 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
21750 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21760 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21770 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21780 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21790 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
217a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
217b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
217c0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
217d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
217e0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
217f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
21800 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
21810 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
21820 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
21830 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21840 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21850 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21860 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21870 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21880 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21890 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
218a0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
218b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
218c0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
218d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
218e0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
218f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21900 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
21910 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
21920 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
21930 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21940 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21960 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21970 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21980 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
219a0 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
219b0 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
219c0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
219d0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
219e0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
219f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21a00 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
21a10 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21a20 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21a30 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21a40 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21a50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21a60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21a70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21a80 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21a90 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21aa0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21ab0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21ac0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21ad0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21ae0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21af0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21b00 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
21b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21b30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21b40 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21b50 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21b60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21b70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21b90 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21ba0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21bb0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21bc0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21bd0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21be0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21bf0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21c00 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21c10 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21c20 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
21c30 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21c40 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21c50 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21c60 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21c70 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21c80 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21c90 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21ca0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21cb0 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21cc0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21cd0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21ce0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21cf0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
21d00 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
21d10 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
21d20 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
21d30 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
21d40 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
21d50 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
21d60 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
21d70 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21d80 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21d90 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21da0 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21db0 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
21dc0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
21dd0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
21de0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
21df0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
21e00 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
21e10 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
21e20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
21e30 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
21e40 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
21e50 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
21e60 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
21e70 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21e80 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21e90 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21ea0 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21eb0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
21ec0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
21ed0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
21ee0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
21ef0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
21f00 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
21f10 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
21f20 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
21f30 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21f40 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
21f50 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
21f60 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
21f70 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21f80 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21f90 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21fa0 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21fb0 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
21fc0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
21fd0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
21fe0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21ff0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
22000 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
22010 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
22020 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
22030 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
22040 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
22050 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22060 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22070 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
22080 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
22090 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
220a0 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
220b0 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
220c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
220d0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
220e0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
220f0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
22100 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
22110 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
22120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22130 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
22140 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
22150 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
22160 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
22170 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
22180 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
22190 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
221a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
221b0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
221c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
221d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
221e0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
221f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
22200 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
22210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
22240 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
22250 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
22260 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
22270 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
222a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
222b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
222c0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
222d0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
222e0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
222f0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
22300 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
22310 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
22320 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
22330 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
22340 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22350 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22370 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22380 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22390 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
223a0 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
223b0 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
223c0 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
223d0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
223e0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
223f0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
22400 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
22410 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
22420 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
22430 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
22440 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22450 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22460 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22470 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22480 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22490 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
224a0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
224b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
224c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
224d0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
224e0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
224f0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
22500 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
22510 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
22520 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
22530 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
22540 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
22550 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22560 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22570 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22580 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22590 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
225a0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
225b0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
225c0 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
225d0 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
225e0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
225f0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
22600 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
22610 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
22620 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
22630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22640 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
22650 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22660 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22670 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22680 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
226a0 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
226b0 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
226c0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
226d0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
226e0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
226f0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
22700 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22710 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
22720 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
22730 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
22740 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22750 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22760 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22770 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22780 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22790 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
227a0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
227b0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
227c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
227d0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
227e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
227f0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
22800 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22820 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
22830 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22840 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22850 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22860 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22870 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22880 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22890 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
228a0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
228b0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
228c0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
228d0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
228e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
228f0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
22900 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
22910 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
22920 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
22930 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22950 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22960 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22970 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22980 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22990 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
229a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
229b0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
229c0 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
229d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
229e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
229f0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
22a00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
22a10 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
22a20 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
22a30 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22a40 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22a50 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22a60 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22a70 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22a80 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22a90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22aa0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22ac0 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22ad0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22ae0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22af0 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
22b00 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
22b10 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
22b20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22b30 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22b40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22b50 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22b60 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22b70 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22b80 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22b90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22ba0 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22bb0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22bc0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22bd0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
22be0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22bf0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
22c00 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
22c10 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
22c20 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
22c30 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22c40 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22c50 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22c60 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22c70 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22c80 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22c90 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22ca0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22cb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22cc0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22cd0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
22ce0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22cf0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
22d00 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
22d10 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22d20 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
22d30 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
22d40 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
22d50 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22d60 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
22d70 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
22d80 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
22d90 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
22da0 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
22db0 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
22dc0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
22dd0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
22de0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
22df0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
22e00 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
22e10 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
22e20 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
22e30 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
22e40 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
22e50 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
22e60 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
22e70 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
22e80 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
22e90 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
22ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
22eb0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
22ec0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
22ed0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
22ee0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22ef0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
22f00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22f10 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
22f20 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
22f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
22f40 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
22f50 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
22f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
22f70 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
22f80 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
22f90 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
22fa0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
22fb0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
22fc0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
22fd0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
22fe0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
22ff0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23000 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
23010 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
23020 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
23030 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
23040 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
23050 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
23060 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
23070 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23080 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
23090 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
230a0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
230b0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
230c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
230d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
230e0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
230f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23100 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
23110 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
23120 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
23130 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23140 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
23160 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
23170 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
23180 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
23190 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
231a0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
231b0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
231c0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
231d0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
231e0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
231f0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
23200 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
23210 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
23220 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
23230 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
23240 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
23250 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
23260 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
23270 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
23280 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
23290 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
232a0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
232b0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
232c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
232d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
232e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
232f0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
23300 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
23310 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
23320 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
23330 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
23340 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
23350 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23360 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23370 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23390 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
233a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
233b0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
233c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
233d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
233e0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
233f0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
23400 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23410 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
23420 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
23430 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
23440 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23450 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23460 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23470 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23480 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23490 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
234a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
234b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
234c0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
234d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
234e0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
234f0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
23500 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
23510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23520 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23530 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
23540 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23550 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23580 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23590 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
235a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
235b0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
235c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
235d0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
235e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
235f0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
23600 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
23610 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
23620 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
23630 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
23640 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23650 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23660 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23670 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23680 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23690 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
236a0 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
236b0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
236c0 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
236d0 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
236e0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
236f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
23700 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
23710 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23720 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
23730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23740 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
23750 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23760 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23770 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23780 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23790 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
237a0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
237b0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
237c0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
237d0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
237e0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
237f0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
23800 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
23810 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
23820 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
23830 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23840 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23850 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23860 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23870 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23880 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23890 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
238a0 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
238b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
238c0 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
238d0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
238e0 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
238f0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
23900 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
23910 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
23920 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
23930 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23940 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23950 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23960 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23970 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23980 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23990 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
239a0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
239b0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
239c0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
239d0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
239e0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
239f0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
23a00 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
23a10 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
23a20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
23a30 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23a40 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23a50 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23a60 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23a70 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23a80 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23a90 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23aa0 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23ab0 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23ac0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23ad0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
23ae0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
23af0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
23b00 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
23b10 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
23b20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
23b30 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23b40 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23b50 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23b60 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23b70 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23b80 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23b90 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23ba0 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23bb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23bc0 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23bd0 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
23be0 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
23bf0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
23c00 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
23c10 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
23c20 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
23c30 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23c40 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23c50 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23c60 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23c70 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23c80 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23c90 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23ca0 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23cb0 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23cc0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23cd0 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
23ce0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
23cf0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
23d00 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
23d10 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
23d20 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
23d30 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
23d40 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
23d50 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
23d60 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
23d70 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
23d80 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
23d90 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
23da0 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
23db0 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
23dc0 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
23dd0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
23de0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
23df0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
23e00 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
23e10 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
23e20 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
23e30 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
23e40 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
23e50 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
23e60 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
23e70 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
23e80 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
23e90 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
23ea0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
23eb0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
23ec0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
23ed0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
23ee0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
23ef0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
23f00 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
23f10 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
23f20 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
23f30 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
23f40 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
23f50 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
23f60 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
23f70 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
23f80 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
23f90 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23fc0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
23fd0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
24000 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
24010 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
24020 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24040 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
24050 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
24060 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
24070 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
24080 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24090 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
240a0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
240b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
240e0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
240f0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
24100 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24120 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
24130 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
24140 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
24170 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
24180 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
24190 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
241a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
241b0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
241c0 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
241d0 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
241e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
241f0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
24200 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
24210 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
24220 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
24230 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
24240 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
24250 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24260 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
24270 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
24280 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24290 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
242a0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
242b0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
242c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
242d0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
242e0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
242f0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
24300 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
24310 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
24320 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
24330 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24340 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
24350 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24360 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24370 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24380 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24390 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
243a0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
243b0 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
243c0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
243d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
243e0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
243f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
24400 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
24410 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
24420 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
24430 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
24440 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24450 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24460 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24470 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24480 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24490 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
244a0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
244b0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
244c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
244d0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
244e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
244f0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
24500 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
24510 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
24520 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
24530 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
24540 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
24550 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24560 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24570 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24580 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24590 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
245a0 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
245b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
245c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
245d0 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
245e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
245f0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
24600 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
24610 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
24620 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
24630 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
24640 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
24650 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24660 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24670 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24680 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24690 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
246a0 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
246b0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
246c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
246d0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
246e0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
246f0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
24700 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
24710 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
24720 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
24730 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
24740 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
24750 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24760 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24770 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24780 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24790 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
247a0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
247b0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
247c0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
247d0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
247e0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
247f0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24800 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
24810 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
24820 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24830 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24860 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24870 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24890 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
248a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
248b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
248e0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
248f0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
24900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24920 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24930 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24940 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24950 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24970 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24980 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24990 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
249c0 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
249d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
249e0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
249f0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
24a00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24a10 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
24a20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24a30 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24a40 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24a50 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24a60 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24a70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24a80 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24aa0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24ab0 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24ac0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
24ae0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
24af0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
24b00 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
24b10 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
24b20 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
24b30 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24b40 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24b50 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24b60 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24b70 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24b80 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24b90 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24ba0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24bb0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24bd0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
24be0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
24bf0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
24c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
24c10 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
24c20 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
24c30 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24c40 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24c50 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24c60 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24c70 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24c80 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24c90 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24ca0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24cb0 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24cc0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24cd0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
24ce0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
24cf0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
24d00 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
24d10 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
24d20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
24d30 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
24d40 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
24d50 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
24d60 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
24d70 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
24d80 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
24d90 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
24da0 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53  BtCursor, BTCURS
24db0 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29  OR_FIRST_UNINIT)
24dc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
24dd0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
24de0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
24df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24e00 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
24e10 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
24e20 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
24e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24e40 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
24e50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24e60 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
24e70 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
24e80 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
24e90 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
24ea0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
24eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24ec0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
24ed0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
24ee0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
24ef0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
24f00 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
24f10 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
24f20 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
24f30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
24f40 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
24f50 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
24f60 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
24f70 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
24f80 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
24f90 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
24fa0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
24fb0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24fd0 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
24fe0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
24ff0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
25000 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
25010 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
25020 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
25030 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
25040 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
25050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25060 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
25070 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
25080 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
25090 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
250a0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
250b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
250c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
250d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
250e0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
250f0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
25100 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
25110 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
25120 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
25130 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
25140 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
25150 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
25160 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
25170 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
25180 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
25190 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
251a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
251b0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
251c0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
251d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
251e0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
251f0 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
25200 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
25210 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f  tic int cellInfo
25220 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a  Equal(CellInfo *
25230 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b  a, CellInfo *b){
25240 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79  .    if( a->nKey
25250 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75  !=b->nKey ) retu
25260 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25270 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50  >pPayload!=b->pP
25280 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20  ayload ) return 
25290 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 50  0;.    if( a->nP
252a0 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c  ayload!=b->nPayl
252b0 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oad ) return 0;.
252c0 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61      if( a->nLoca
252d0 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72  l!=b->nLocal ) r
252e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
252f0 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53   a->nSize!=b->nS
25300 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ize ) return 0;.
25310 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25320 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  }.  static void 
25330 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
25340 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25350 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
25360 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  o;.    memset(&i
25370 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
25380 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
25390 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
253a0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c  pPage, pCur->ix,
253b0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
253c0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
253d0 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c  || cellInfoEqual
253e0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
253f0 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  nfo) );.  }.#els
25400 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
25410 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
25420 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
25430 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
25440 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
25450 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25460 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
25470 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Size==0 ){.    p
25480 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
25490 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
254a0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
254b0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
254c0 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e  pCur->ix,&pCur->
254d0 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
254e0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
254f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
25500 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
25510 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
25520 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
25530 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
25540 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
25550 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
25560 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
25570 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
25580 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
25590 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
255a0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
255b0 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
255c0 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
255d0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
255e0 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
255f0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
25600 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
25610 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
25620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25630 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
25640 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25650 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
25660 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
25670 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
25680 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
25690 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  G */.int sqlite3
256a0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
256b0 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70  idNN(BtCursor *p
256c0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
256d0 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  pCur!=0 );.  ret
256e0 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
256f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
25700 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25710 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
25720 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20   integer key or 
25730 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61  "rowid" for a ta
25740 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68  ble btree..** Th
25750 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
25760 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63  ly valid for a c
25770 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
25780 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a  inting into a.**
25790 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
257a0 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63  btree.  If the c
257b0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
257c0 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f  an index btree o
257d0 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c  r.** is invalid,
257e0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
257f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
25800 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34  ndefined..*/.i64
25810 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
25820 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
25830 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
25840 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25850 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25860 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25870 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25880 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
25890 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
258a0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
258b0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
258c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
258d0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
258e0 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
258f0 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52  SQL_FUNC./*.** R
25900 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
25910 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
25920 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
25930 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
25940 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69 63 68  payload to which
25950 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
25960 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20  ointing..*/.i64 
25970 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73  sqlite3BtreeOffs
25980 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  et(BtCursor *pCu
25990 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
259a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
259b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
259c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
259d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
259e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
259f0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  ur);.  return (i
25a00 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  64)pCur->pBt->pa
25a10 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70 43 75  geSize*((i64)pCu
25a20 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d  r->pPage->pgno -
25a30 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20 20 28   1) +.         (
25a40 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  i64)(pCur->info.
25a50 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d  pPayload - pCur-
25a60 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  >pPage->aData);.
25a70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25a80 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
25a90 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a  _SQL_FUNC */../*
25aa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
25ab0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
25ac0 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  f payload for th
25ad0 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43 75  e entry that pCu
25ae0 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  r is.** currentl
25af0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  y pointing to.  
25b00 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65 73  For table btrees
25b10 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
25b20 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  he amount.** of 
25b30 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78  data.  For index
25b40 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
25b50 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f  ll be the size o
25b60 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  f the key..**.**
25b70 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
25b80 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
25b90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
25ba0 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
25bb0 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
25bc0 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
25bd0 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
25be0 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
25bf0 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
25c00 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
25c10 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
25c20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
25c30 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  /.u32 sqlite3Btr
25c40 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74  eePayloadSize(Bt
25c50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25c60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25c70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25c90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25ca0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
25cb0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25cc0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
25cd0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.nPayload;.}.
25ce0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
25cf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25d00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25d10 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25d20 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
25d30 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
25d40 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
25d50 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
25d60 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
25d70 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
25d80 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
25d90 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
25da0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
25db0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
25dc0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
25dd0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
25de0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
25df0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
25e00 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
25e10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
25e20 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25e30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
25e40 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
25e50 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25e60 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
25e70 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
25e80 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
25e90 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
25ea0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
25eb0 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
25ec0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
25ed0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
25ee0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
25ef0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
25f00 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
25f10 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
25f20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
25f30 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
25f40 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
25f50 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
25f60 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
25f70 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
25f80 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
25f90 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
25fa0 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
25fb0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
25fc0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
25fd0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
25fe0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
25ff0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
26000 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
26010 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
26020 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
26030 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
26040 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
26050 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
26060 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
26070 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
26080 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
26090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
260a0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
260b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
260e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
260f0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
26100 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
26110 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
26120 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
26130 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
26140 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26150 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
26160 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
26170 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
26180 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
26190 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
261a0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
261b0 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
261c0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
261d0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
261e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
261f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
26200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26210 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26220 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
26230 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
26240 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26250 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
26260 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
26270 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26280 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
26290 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
262a0 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
262b0 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
262c0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
262d0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
262e0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
262f0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
26300 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
26310 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
26320 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
26330 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
26340 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
26350 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
26360 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
26370 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
26380 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
26390 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
263a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
263b0 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
263c0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
263d0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
263e0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
263f0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
26400 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
26410 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
26420 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
26430 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
26440 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
26450 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
26460 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
26470 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
26480 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
26490 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
264a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
264b0 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
264c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
264d0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
264e0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
264f0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
26500 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
26510 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26520 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
26530 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
26540 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
26550 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
26560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
26570 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26580 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
26590 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
265a0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
265b0 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
265c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
265d0 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
265e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
265f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26600 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
26610 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
26620 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
26630 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
26640 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
26650 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
26660 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
26670 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
26680 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
26690 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
266a0 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
266b0 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
266c0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
266d0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
266e0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
266f0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
26700 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
26710 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
26720 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
26730 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
26740 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
26750 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
26760 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
26770 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
26780 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
26790 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
267a0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
267b0 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
267c0 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
267d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
267e0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
267f0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
26800 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
26810 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
26820 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
26830 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
26840 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
26850 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
26860 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
26870 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
26880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26890 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
268a0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
268b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
268c0 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
268d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
268e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
268f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
26900 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
26910 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
26920 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26930 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
26940 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26960 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
26970 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
26980 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
26990 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
269a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
269b0 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
269c0 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
269d0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
269e0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
269f0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
26a00 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
26a10 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
26a20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26a30 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
26a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26a60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
26a70 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
26a80 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
26a90 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
26aa0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
26ab0 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
26ac0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
26ad0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
26ae0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
26af0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
26b00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26b10 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26b20 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
26b30 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
26b40 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
26b50 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
26b60 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
26b70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
26b80 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
26b90 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
26ba0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
26bb0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
26bc0 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
26bd0 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
26be0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
26bf0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
26c00 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
26c10 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
26c20 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
26c30 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
26c40 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
26c50 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
26c60 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
26c70 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
26c80 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
26c90 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
26ca0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
26cb0 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
26cc0 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
26cd0 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
26ce0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
26cf0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
26d00 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
26d10 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
26d20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
26d30 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
26d40 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
26d50 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
26d60 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73  ow pages.** this
26d70 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
26d80 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
26d90 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75   and lazily popu
26da0 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72  late.** the over
26db0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26dc0 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
26dd0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
26de0 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20   .** Subsequent 
26df0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63  calls use this c
26e00 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
26e10 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
26e20 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20  lied offset .** 
26e30 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
26e40 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
26e50 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26e60 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
26e70 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75  allocated, it mu
26e80 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
26e90 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
26ea0 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
26eb0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
26ec0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
26ed0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
26ee0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
26ef0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
26f00 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
26f10 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
26f20 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
26f30 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
26f40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
26f50 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
26f60 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
26f70 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
26f80 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
26f90 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
26fa0 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
26fb0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
26fc0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
26fd0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
26fe0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
26ff0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
27000 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
27010 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
27020 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
27030 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
27040 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
27050 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
27060 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
27070 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
27080 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
27090 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
270a0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
270b0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
270c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
270d0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
270e0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
270f0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
27100 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
27110 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
27120 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
27130 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
27140 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
27150 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
27160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
27170 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
27180 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
27190 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
271a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
271b0 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
271c0 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
271d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
271e0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
271f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
27200 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
27210 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
27220 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
27230 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
27240 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27250 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
27260 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a  t = pBuf;     /*
27270 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e   Start of origin
27280 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f  al out buffer */
27290 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
272a0 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
272b0 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20  sert( eOp==0 || 
272c0 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eOp==1 );.  asse
272d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
272e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
272f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27300 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
27310 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
27320 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27330 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
27340 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
27350 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
27360 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
27370 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
27380 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69  t+amt <= pCur->i
27390 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
273a0 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79 6c  .  assert( aPayl
273b0 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  oad > pPage->aDa
273c0 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74  ta );.  if( (upt
273d0 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50  r)(aPayload - pP
273e0 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70  age->aData) > (p
273f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
27400 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27410 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  al) ){.    /* Tr
27420 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
27430 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
27440 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
27450 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
27460 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  .    ** conditio
27470 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61  nal above is rea
27480 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26  lly:.    **    &
27490 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
274a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
274b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
274c0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20  >usableSize].   
274d0 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61 73   ** but is recas
274e0 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65  t into its curre
274f0 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64  nt form to avoid
27500 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
27510 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a  w problems.    *
27520 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
27530 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
27540 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  (pPage);.  }..  
27550 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
27560 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
27570 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
27580 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
27590 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
275a0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
275b0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
275c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
275d0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
275e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
275f0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
27600 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
27610 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
27620 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
27630 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
27640 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
27650 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
27660 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
27670 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
27680 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
27690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
276a0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
276b0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
276c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
276d0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
276e0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
276f0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
27700 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
27710 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
27720 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
27730 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
27740 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
27750 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
27760 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
27770 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
27780 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
27790 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
277a0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
277b0 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
277c0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
277d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
277e0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
277f0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
27800 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
27810 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
27820 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
27830 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
27840 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
27850 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
27860 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
27870 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
27880 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
27890 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
278a0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
278b0 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
278c0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
278d0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
278e0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
278f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
27900 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
27910 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
27920 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
27930 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
27940 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
27950 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
27960 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
27970 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
27980 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d  Cur->aOverflow==
27990 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66  0.       || nOvf
279a0 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67  l*(int)sizeof(Pg
279b0 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c  no) > sqlite3Mal
279c0 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f  locSize(pCur->aO
279d0 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29  verflow).      )
279e0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
279f0 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
27a00 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
27a10 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
27a20 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
27a30 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
27a40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27a50 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
27a60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
27a70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27a80 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
27a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
27aa0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
27ab0 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
27ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
27ad0 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
27ae0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
27af0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
27b00 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
27b10 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
27b20 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
27b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
27b40 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27b50 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
27b60 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
27b70 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
27b80 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
27b90 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
27ba0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
27bb0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
27bc0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
27bd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27be0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27bf0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
27c00 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
27c10 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
27c20 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
27c30 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
27c40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27c50 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
27c60 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
27c70 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
27c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
27c90 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27ca0 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
27cb0 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
27cc0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
27cd0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
27ce0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
27cf0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27d00 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
27d10 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
27d20 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
27d30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
27d40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27d50 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
27d60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
27d70 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
27d80 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
27d90 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
27da0 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
27db0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
27dc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27dd0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
27de0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
27df0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
27e00 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27e10 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
27e20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
27e30 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
27e40 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
27e50 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
27e60 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
27e70 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
27e80 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
27e90 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
27ea0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
27eb0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
27ec0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
27ed0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
27ee0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
27ef0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27f00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27f10 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27f20 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
27f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27f40 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
27f50 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
27f60 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
27f70 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
27f80 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
27f90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
27fa0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
27fb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27fc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
27fd0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
27fe0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
27ff0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
28000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
28010 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
28020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28030 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
28040 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28050 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
28060 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
28070 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
28080 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
28090 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
280a0 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
280b0 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
280c0 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
280d0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
280e0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
280f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
28100 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c  *fd;      /* Fil
28110 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
28120 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c  do direct overfl
28130 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  ow read */.#endi
28140 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
28150 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
28160 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
28170 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
28180 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
28190 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
281a0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
281b0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
281c0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
281d0 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
281e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
281f0 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
28200 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
28210 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
28220 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
28230 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
28240 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
28250 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
28260 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
28270 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
28280 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20    **   3) there 
28290 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
282a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
282b0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
282c0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
282d0 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
282e0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
282f0 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
28300 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
28310 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
28320 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
28330 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
28340 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
28350 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
28360 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
28370 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
28380 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
28390 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
283a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
283b0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
283c0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
283d0 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
283e0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
283f0 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
28400 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
28410 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
28420 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
28430 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
28440 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
28450 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
28460 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
284a0 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
284e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
284f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
28500 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
28530 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
28540 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
28550 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
28560 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34  ethods     /* (4
28570 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
28580 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
28590 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  UseWal(pBt->pPag
285a0 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
285b0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
285c0 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
285d0 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28600 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
28610 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
28620 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
28630 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
28640 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
28650 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
28660 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
28670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
28690 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
286a0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
286b0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
286c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
286d0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
286e0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
286f0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
28700 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
28710 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
28720 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
28730 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
28740 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
28750 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
28760 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
28770 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
28780 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
28790 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
287a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
287b0 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
287c0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
287d0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
287e0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
287f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
28800 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
28810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28830 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
28840 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
28850 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
28860 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28870 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
28880 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
28890 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
288a0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
288b0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
288c0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
288d0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
288e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
288f0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
28900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
28910 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
28920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28930 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
28940 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
28950 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
28960 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
28970 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
28980 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
28990 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
289a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
289b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
289c0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
289d0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
289e0 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
289f0 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
28a00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28a10 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
28a20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28a30 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
28a40 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
28a50 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
28a60 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
28a70 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
28a80 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
28a90 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
28aa0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
28ab0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
28ac0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
28ad0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
28ae0 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
28af0 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
28b00 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
28b10 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
28b20 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
28b30 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
28b40 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
28b50 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
28b60 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
28b70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
28b80 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
28b90 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
28ba0 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
28bb0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
28bc0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
28bd0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
28be0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
28bf0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
28c00 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
28c10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
28c20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
28c30 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
28c40 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
28c50 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
28c60 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
28c70 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
28c80 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
28c90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
28ca0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
28cb0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
28cc0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
28cd0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
28ce0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
28cf0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
28d00 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
28d10 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
28d20 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
28d30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28d40 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
28d50 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
28d60 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
28d70 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
28d80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28d90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28da0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28db0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28dc0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28dd0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28de0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
28df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28e00 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
28e10 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
28e20 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
28e30 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28e40 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
28e50 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
28e60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
28e70 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
28e80 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
28e90 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
28ea0 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
28eb0 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
28ec0 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
28ed0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
28ee0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
28ef0 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
28f00 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
28f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
28f20 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
28f30 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
28f40 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
28f50 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
28f60 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
28f70 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
28f80 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
28f90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28fa0 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
28fb0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28fc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28fd0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28fe0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28ff0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29000 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
29010 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
29020 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
29030 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
29040 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
29050 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
29060 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
29070 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
29080 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
29090 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
290a0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
290b0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
290c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
290d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
290e0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
290f0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29100 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
29110 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
29120 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
29130 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
29140 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29150 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
29160 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
29170 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
29180 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
29190 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
291a0 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
291b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
291c0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
291d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
291e0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
291f0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
29200 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
29210 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
29220 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
29230 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
29240 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
29250 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
29260 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
29270 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
29280 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
29290 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
292a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
292b0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
292c0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
292d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
292e0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
292f0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
29300 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
29310 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
29320 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
29330 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
29340 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
29350 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
29360 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
29370 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
29380 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
29390 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
293a0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
293b0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
293c0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
293d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
293e0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
293f0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
29400 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
29410 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
29420 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
29430 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
29440 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
29450 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
29460 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
29470 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
29480 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
29490 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
294a0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
294b0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
294c0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
294d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
294e0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
294f0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
29500 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
29510 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29520 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
29530 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
29540 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
29550 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
29560 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
29570 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
29580 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
29590 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
295a0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
295b0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
295c0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
295d0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
295e0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
295f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
29600 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
29610 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
29620 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65   int amt;.  asse
29630 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
29640 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
29650 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
29660 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29670 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29680 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
29690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
296a0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
296b0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
296c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
296d0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
296e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
296f0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
29700 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
29710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29720 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
29730 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29740 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
29750 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
29760 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
29770 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29780 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
29790 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
297a0 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
297b0 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72  B);.  amt = pCur
297c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
297d0 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70   if( amt>(int)(p
297e0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
297f0 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
29800 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20  o.pPayload) ){. 
29810 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74     /* There is t
29820 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20  oo little space 
29830 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20  on the page for 
29840 74 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f  the expected amo
29850 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f  unt.    ** of lo
29860 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74  cal content. Dat
29870 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29880 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73  rrupt. */.    as
29890 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
298a0 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41   );.    amt = MA
298b0 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d  X(0, (int)(pCur-
298c0 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
298d0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
298e0 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20  ayload));.  }.  
298f0 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74  *pAmt = (u32)amt
29900 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
29910 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
29920 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
29930 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
29940 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
29950 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
29960 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
29970 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
29980 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
29990 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
299a0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
299b0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
299c0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
299d0 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
299e0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
299f0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
29a00 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
29a10 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
29a20 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
29a30 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
29a40 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
29a50 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
29a60 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
29a70 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
29a80 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
29a90 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
29aa0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
29ab0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
29ac0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
29ad0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
29ae0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
29af0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
29b00 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
29b10 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
29b20 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
29b30 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
29b40 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
29b50 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
29b60 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
29b70 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
29b80 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
29b90 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
29ba0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
29bb0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
29bc0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
29bd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
29be0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
29bf0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
29c00 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
29c10 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
29c20 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
29c30 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
29c40 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
29c50 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
29c60 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
29c70 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
29c80 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
29c90 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
29ca0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
29cb0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
29cc0 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
29cd0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
29ce0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
29cf0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
29d00 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
29d10 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
29d20 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
29d30 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
29d40 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29d50 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
29d60 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
29d70 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
29d80 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
29d90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29da0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29db0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29dc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29dd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29de0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29df0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
29e00 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
29e10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29e20 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
29e30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
29e40 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
29e50 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
29e60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29e70 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
29e80 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29e90 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29ea0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
29eb0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29ec0 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
29ed0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29ee0 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  e] = pCur->ix;. 
29ef0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29f00 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75  ur->iPage] = pCu
29f10 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
29f20 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  ->ix = 0;.  pCur
29f30 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74  ->iPage++;.  ret
29f40 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
29f50 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
29f60 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70   &pCur->pPage, p
29f70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
29f80 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
29f90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29fa0 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
29fb0 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
29fc0 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
29fd0 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
29fe0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
29ff0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
2a000 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2a010 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
2a020 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
2a030 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
2a040 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
2a050 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
2a060 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2a070 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
2a080 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
2a090 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
2a0a0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
2a0b0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
2a0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a0d0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2a0e0 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
2a0f0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
2a100 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
2a110 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
2a120 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
2a130 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
2a140 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
2a150 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
2a180 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
2a190 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
2a1a0 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
2a1b0 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
2a1c0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2a1d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
2a1e0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2a1f0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2a200 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
2a210 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
2a220 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
2a230 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2a240 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
2a250 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
2a260 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
2a270 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
2a280 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
2a290 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
2a2a0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
2a2b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2a2c0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
2a2d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
2a2e0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
2a2f0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
2a300 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
2a310 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
2a320 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
2a330 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
2a340 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
2a350 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
2a360 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2a370 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
2a380 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
2a390 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
2a3a0 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
2a3b0 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
2a3c0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2a3d0 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73  ge *pLeaf;.  ass
2a3e0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2a3f0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2a400 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a410 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a420 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2a430 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
2a440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a450 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
2a460 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2a470 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
2a480 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a490 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
2a4a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a4b0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70  1], .    pCur->p
2a4c0 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  Page->pgno.  );.
2a4d0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
2a4e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a4f0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
2a500 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a510 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
2a520 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a530 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2a540 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2a550 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a560 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2a570 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
2a580 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a590 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20  e-1];.  pLeaf = 
2a5a0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2a5b0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2a5c0 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72  r->apPage[--pCur
2a5d0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65  ->iPage];.  rele
2a5e0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2a5f0 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Leaf);.}../*.** 
2a600 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a610 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2a620 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
2a630 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2a640 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a650 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
2a660 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
2a670 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2a680 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
2a690 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
2a6a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
2a6b0 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
2a6c0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
2a6d0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
2a6e0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2a6f0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
2a700 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
2a710 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
2a720 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
2a730 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
2a740 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
2a750 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
2a760 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
2a770 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
2a780 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
2a790 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
2a7a0 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2a7b0 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
2a7c0 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72  VALID and this r
2a7d0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
2a7e0 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68  QLITE_EMPTY. Oth
2a7f0 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63  erwise,.** the c
2a800 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
2a810 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
2a820 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  st cell located 
2a830 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28  on the root.** (
2a840 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
2a850 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
2a860 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2a870 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2a880 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2a890 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a8a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2a8b0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2a8c0 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2a8d0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2a8e0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2a8f0 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2a900 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2a910 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2a920 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2a930 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2a940 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2a950 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2a960 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2a970 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2a980 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a990 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2a9a0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2a9b0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2a9c0 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2a9d0 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2a9e0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2a9f0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2aa00 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2aa10 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2aa20 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2aa30 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2aa40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2aa50 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2aa60 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2aa70 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2aa80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2aa90 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2aaa0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2aab0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2aac0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2aad0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2aae0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2aaf0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2ab00 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2ab10 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2ab20 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2ab30 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2ab40 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2ab50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ab60 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45  tate < CURSOR_RE
2ab70 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75  QUIRESEEK || pCu
2ab80 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20  r->iPage<0 );.  
2ab90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2aba0 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72  noRoot>0 || pCur
2abb0 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20  ->iPage<0 );..  
2abc0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2abd0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  =0 ){.    if( pC
2abe0 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2abf0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2ac00 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  tNull(pCur->pPag
2ac10 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  e);.      while(
2ac20 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29   --pCur->iPage )
2ac30 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2ac40 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2ac50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ac60 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d  iPage]);.      }
2ac70 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61  .      pCur->pPa
2ac80 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2ac90 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e[0];.      goto
2aca0 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
2acb0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
2acc0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2acd0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2ace0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2acf0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
2ad00 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2ad10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2ad20 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2ad30 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28  =(-1) );.    if(
2ad40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
2ad50 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2ad60 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2ad70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ad80 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2ad90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ada0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
2adb0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2adc0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2add0 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  kipNext;.      }
2ade0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2adf0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2ae00 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2ae10 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2ae20 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
2ae30 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2ae40 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
2ae50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2ae70 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2ae80 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2ae90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aea0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2aeb0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2aec0 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2aed0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2aee0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
2aef0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74      pCur->curInt
2af00 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  Key = pCur->pPag
2af10 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20  e->intKey;.  }. 
2af20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2af30 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2af40 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
2af50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
2af60 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
2af70 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
2af80 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
2af90 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
2afa0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
2afb0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
2afc0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
2afd0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
2afe0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
2aff0 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
2b000 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
2b010 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
2b020 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2b030 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
2b040 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
2b050 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
2b060 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
2b070 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2b080 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
2b090 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
2b0a0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
2b0b0 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
2b0c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
2b0d0 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
2b0e0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2b0f0 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
2b100 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
2b110 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
2b120 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
2b130 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
2b140 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
2b150 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
2b160 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
2b170 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
2b180 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
2b190 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
2b1a0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
2b1b0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2b1c0 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
2b1d0 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
2b1e0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
2b1f0 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
2b200 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
2b210 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
2b220 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b230 50 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50  PT_PAGE(pCur->pP
2b240 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f  age);.  }..skip_
2b250 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e  init:  .  pCur->
2b260 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2b270 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2b280 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b290 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2b2a0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
2b2b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2b2c0 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  ;..  pRoot = pCu
2b2d0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2b2e0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
2b2f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2b300 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2b310 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
2b320 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
2b330 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
2b340 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
2b350 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
2b360 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b370 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
2b380 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
2b390 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
2b3a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2b3b0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2b3c0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2b3d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b3e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
2b3f0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
2b400 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2b410 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2b420 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  D;.    rc = SQLI
2b430 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20  TE_EMPTY;.  }.  
2b440 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b450 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b460 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2b470 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2b480 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b490 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2b4a0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b4b0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2b4c0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2b4d0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2b4e0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2b4f0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2b500 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2b510 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b520 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2b530 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2b540 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2b550 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2b560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2b570 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2b580 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b590 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b5a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b5b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b5c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2b5d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b5e0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2b5f0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2b600 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
2b610 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
2b620 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
2b630 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
2b640 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b650 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72  Cur->ix));.    r
2b660 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b670 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
2b680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b690 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b6a0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2b6b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
2b6c0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2b6d0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
2b6e0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2b6f0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
2b700 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
2b710 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
2b720 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2b730 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
2b740 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
2b750 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
2b760 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
2b770 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2b780 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
2b790 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
2b7a0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
2b7b0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2b7c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b7d0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
2b7e0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2b7f0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
2b800 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2b810 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
2b820 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
2b830 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b840 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
2b850 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
2b860 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2b870 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2b880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2b890 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2b8a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b8b0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b8c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b8d0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2b8e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2b8f0 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2b900 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2b910 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2b920 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2b930 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b940 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b950 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  ;.    pCur->ix =
2b960 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2b970 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b980 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2b990 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b9a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
2b9b0 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2b9c0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
2b9d0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2b9e0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
2b9f0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2ba00 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2ba10 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
2ba20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ba30 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2ba40 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
2ba50 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2ba60 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2ba70 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2ba80 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2ba90 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2baa0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2bab0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2bac0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2bad0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2bae0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2baf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2bb00 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
2bb10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2bb20 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
2bb30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2bb40 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2bb50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2bb60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2bb70 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2bb80 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2bb90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2bba0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2bbb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bbc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bbd0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
2bbe0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2bbf0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2bc00 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2bc10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2bc20 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2bc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2bc40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2bc50 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2bc60 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2bc70 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2bc80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bc90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2bcb0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2bcc0 20 69 66 20 63 75 72 73 6f 72 20 70 43 75 72 20   if cursor pCur 
2bcd0 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74  does not point t
2bce0 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a  o a valid row..*
2bcf0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
2bd00 70 43 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63  pCur is valid, c
2bd10 6f 6e 66 69 67 75 72 65 20 69 74 20 73 6f 20 74  onfigure it so t
2bd20 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c  hat the next cal
2bd30 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  l to.** sqlite3B
2bd40 74 72 65 65 4e 65 78 74 28 29 20 69 73 20 61 20  treeNext() is a 
2bd50 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65  no-op..*/.#ifnde
2bd60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
2bd70 4e 44 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71  NDOWFUNC.void sq
2bd80 6c 69 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65  lite3BtreeSkipNe
2bd90 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2bda0 72 29 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69  r){.  /* We beli
2bdb0 65 76 65 20 74 68 61 74 20 74 68 65 20 63 75 72  eve that the cur
2bdc0 73 6f 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20  sor must always 
2bdd0 62 65 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20  be in the valid 
2bde0 73 74 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20  state when.  ** 
2bdf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2be00 63 61 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20  called, but the 
2be10 70 72 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75  proof is difficu
2be20 6c 74 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e  lt, so we add an
2be30 0a 20 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74  .  ** ALWaYS() t
2be40 65 73 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65  est just in case
2be50 20 77 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a   we are wrong. *
2be60 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
2be70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2be80 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
2be90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bea0 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
2beb0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  ;.    pCur->skip
2bec0 4e 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Next = 1;.  }.}.
2bed0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bee0 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
2bef0 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65   */../* Move the
2bf00 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
2bf10 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2bf20 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2bf30 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2bf40 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2bf50 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2bf60 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2bf70 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2bf80 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2bf90 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2bfa0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2bfb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2bfc0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
2bfd0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2bfe0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
2bff0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2c000 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2c010 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c020 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2c030 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2c040 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2c050 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2c060 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2c070 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2c080 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2c090 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2c0a0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2c0b0 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2c0c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2c0d0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2c0e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2c0f0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2c100 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2c110 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2c120 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2c130 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2c140 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2c150 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2c160 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2c170 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2c180 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2c190 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2c1a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2c1b0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2c1c0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2c1d0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2c1e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d  sert( pCur->ix==
2c1f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2c200 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
2c210 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2c220 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2c230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c240 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2c250 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2c260 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2c270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2c280 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2c290 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2c2a0 44 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D );.    *pRes =
2c2b0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
2c2c0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2c2d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
2c2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c2f0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2c300 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2c310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c320 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2c330 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
2c340 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2c350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c360 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73  EMPTY ){.    ass
2c370 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2c380 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2c390 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2c3a0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
2c3b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2c3c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
2c3d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2c3e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2c3f0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2c400 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2c410 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2c420 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2c430 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2c440 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2c450 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2c460 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2c470 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2c480 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2c490 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2c4a0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2c4b0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2c4c0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2c4d0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2c4e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2c4f0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2c500 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2c510 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2c520 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2c530 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2c540 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2c550 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2c560 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2c570 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2c580 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2c590 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2c5a0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2c5b0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2c5c0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2c5d0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2c5e0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2c5f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2c600 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2c610 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2c620 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2c630 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2c640 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2c650 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2c660 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2c670 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2c680 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2c690 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2c6a0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2c6b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2c6c0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6e0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2c6f0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2c700 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2c710 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2c730 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2c740 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2c750 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2c760 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2c770 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2c780 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2c790 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2c7a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2c7b0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2c7c0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2c7d0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2c7e0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2c7f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2c800 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c810 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2c840 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2c850 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2c860 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2c870 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2c880 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2c890 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2c8a0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2c8b0 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2c8c0 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2c8d0 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2c8e0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2c8f0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2c900 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2c910 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2c920 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2c930 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2c940 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2c950 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2c960 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2c970 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2c980 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2c990 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2c9a0 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2c9b0 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2c9c0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2c9d0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2c9e0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2ca00 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2ca10 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2ca20 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2ca30 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2ca40 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2ca50 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ca60 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ca70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ca80 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ca90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2caa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2cab0 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2cac0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2cad0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2cae0 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
2caf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2cb00 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28  URSOR_VALID || (
2cb10 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2cb20 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30  ur->curIntKey!=0
2cb30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2cb40 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2cb50 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
2cb60 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
2cb70 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
2cb80 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
2cb90 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
2cba0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
2cbb0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  rk */.  if( pIdx
2cbc0 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75  Key==0.   && pCu
2cbd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2cbe0 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
2cbf0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2cc00 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
2cc10 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
2cc20 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2cc30 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2cc40 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2cc50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cc60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2cc70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2cc80 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69  ntKey ){.      i
2cc90 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
2cca0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2ccb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ccc0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2ccd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cce0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2ccf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
2cd00 71 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f  quested key is o
2cd10 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
2cd20 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74   previous key, t
2cd30 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79  hen.      ** try
2cd40 20 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73   to get there us
2cd50 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65  ing sqlite3Btree
2cd60 4e 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68  Next() rather th
2cd70 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20  an a full.      
2cd80 2a 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68  ** binary search
2cd90 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
2cda0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e  timization only.
2cdb0 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e    The correct an
2cdc0 73 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  swer.      ** is
2cdd0 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20   still obtained 
2cde0 77 69 74 68 6f 75 74 20 74 68 69 73 20 63 61 73  without this cas
2cdf0 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65  e, only a little
2ce00 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f   more slowely */
2ce10 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2ce20 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e  >info.nKey+1==in
2ce30 74 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73  tKey && !pCur->s
2ce40 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2ce50 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2ce60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ce70 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2ce80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2ce90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  ){.          get
2ceb0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
2cec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2ced0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2cee0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2cef0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2cf00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2cf10 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2cf20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cf30 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
2cf40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2cf50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cf60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2cf70 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2cf80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cf90 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2cfa0 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2cfb0 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2cfc0 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2cfd0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2cfe0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2cff0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2d000 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2d010 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2d020 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2d030 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2d040 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2d050 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2d060 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2d070 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2d080 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2d090 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2d0a0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2d0b0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2d0c0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2d0d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d0e0 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20  _EMPTY ){.      
2d0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2d100 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2d110 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2d120 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
2d130 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2d140 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d150 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2d160 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2d170 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
2d180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d190 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
2d1a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d1b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d1c0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d1d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2d1e0 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20  ->nCell > 0 );. 
2d1f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d200 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Page==0 || pCur-
2d210 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2d220 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2d230 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2d240 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2d250 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2d260 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2d270 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2d280 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2d290 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2d2a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2d2b0 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70  pPage;.    u8 *p
2d2c0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d2e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
2d2f0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
2d300 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
2d310 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
2d320 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
2d330 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
2d340 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
2d350 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
2d360 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2d370 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
2d380 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
2d390 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
2d3a0 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
2d3b0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
2d3c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
2d3d0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
2d3e0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
2d3f0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
2d400 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
2d410 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
2d420 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
2d430 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
2d440 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
2d450 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
2d460 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
2d470 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
2d480 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
2d490 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
2d4a0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
2d4b0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
2d4c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d4d0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
2d4e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2d4f0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
2d500 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
2d510 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
2d520 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2d530 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
2d540 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
2d550 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
2d560 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
2d570 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
2d580 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
2d590 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
2d5a0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20  */.    pCur->ix 
2d5b0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2d5c0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
2d5d0 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
2d5e0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2d5f0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
2d600 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2d610 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2d620 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20  age, idx);.     
2d630 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2d640 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
2d650 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38        while( 0x8
2d660 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20  0 <= *(pCell++) 
2d670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2d680 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d  f( pCell>=pPage-
2d690 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
2d6a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2d6b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2d6c0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2d6d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d6f0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2d700 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2d710 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2d720 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2d730 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2d740 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2d750 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2d760 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2d770 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2d780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2d790 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2d7a0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2d7b0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2d7c0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2d7d0 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2d7e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2d7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2d800 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2d810 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2d820 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2d830 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2d840 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d850 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
2d860 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
2d870 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2d880 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
2d890 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2d8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2d8b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2d8c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
2d8d0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2d8e0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2d8f0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2d900 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2d910 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ize = 0;.       
2d920 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2d930 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2d940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d960 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2d970 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2d980 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2d990 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2d9a0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2d9b0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2d9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d9d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2d9e0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2d9f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2da00 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2da10 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2da20 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2da30 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2da40 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
2da50 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
2da60 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
2da70 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
2da80 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
2da90 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
2daa0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
2dab0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
2dac0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
2dad0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
2dae0 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
2daf0 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
2db00 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
2db10 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
2db20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
2db30 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2db40 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
2db50 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
2db60 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
2db70 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2db80 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
2db90 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
2dba0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
2dbb0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
2dbc0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
2dbd0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
2dbe0 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
2dbf0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
2dc00 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
2dc10 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
2dc20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
2dc30 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
2dc40 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2dc50 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
2dc60 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
2dc70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2dc80 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
2dc90 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2dca0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
2dcb0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
2dcc0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
2dcd0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2dce0 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
2dcf0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
2dd00 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
2dd10 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2dd20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2dd30 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
2dd40 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2dd50 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2dd60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2dd70 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2dd80 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
2dd90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2dda0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
2ddb0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
2ddc0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
2ddd0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
2dde0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
2ddf0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
2de00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2de10 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
2de20 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
2de30 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2de40 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
2de50 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
2de60 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2de70 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
2de80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2de90 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2dea0 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
2deb0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2dec0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2ded0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2dee0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
2def0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2df00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2df10 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2df20 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
2df30 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
2df40 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
2df50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2df60 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
2df70 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
2df80 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
2df90 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
2dfa0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
2dfb0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
2dfc0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
2dfd0 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
2dfe0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
2dff0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
2e000 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
2e010 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
2e020 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
2e030 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2e040 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2e050 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
2e060 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
2e070 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
2e080 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
2e090 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
2e0a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2e0b0 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
2e0c0 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
2e0d0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
2e0e0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
2e0f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2e100 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
2e110 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
2e120 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
2e130 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2e140 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2e150 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
2e160 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
2e170 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2e180 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2e190 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
2e1a0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  l(pPage, pCellBo
2e1b0 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
2e1c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
2e1d0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
2e1e0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
2e1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e200 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72  ell<0 );   /* Tr
2e210 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69  ue if key size i
2e220 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a  s 2^32 or more *
2e230 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2e240 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29  case( nCell==0 )
2e250 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2e260 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2e270 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20  80 0x00 */.     
2e280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2e290 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49  Cell==1 );  /* I
2e2a0 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2e2b0 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31    0x80 0x80 0x01
2e2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2e2d0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32  stcase( nCell==2
2e2e0 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
2e2f0 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20  legal index key 
2e300 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
2e310 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b    if( nCell<2 ){
2e320 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e330 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2e340 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
2e350 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2e360 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2e370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e380 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
2e390 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
2e3a0 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
2e3b0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
2e3c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2e3d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e3e0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2e3f0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2e400 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2e410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e420 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e430 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2e440 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2e450 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2e460 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2e470 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b  r*)pCellKey, 0);
2e480 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2e490 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2e4a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
2e4b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2e4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2e4d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2e4e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2e4f0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2e500 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2e510 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2e520 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2e530 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2e540 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2e550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e560 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2e570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2e580 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2e590 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2e5a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2e5b0 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2e5c0 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2e5d0 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2e5e0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2e5f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2e600 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2e610 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2e620 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2e630 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2e640 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e650 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2e660 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2e670 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2e680 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2e690 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2e6a0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2e6b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e6c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e6d0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2e6e0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2e6f0 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2e700 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2e710 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e720 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2e730 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e750 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2e760 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2e770 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2e780 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2e790 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2e7a0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2e7b0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2e7c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2e7d0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2e7e0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2e7f0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2e800 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2e810 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2e820 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2e830 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e840 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e850 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
2e860 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2e870 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2e880 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2e890 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2e8a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e8b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2e8c0 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2e8d0 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2e8e0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2e8f0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2e900 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2e910 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2e920 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2e930 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2e940 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2e950 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2e960 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2e970 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2e980 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
2e990 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2e9a0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2e9b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2e9c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2e9d0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2e9e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2ea00 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2ea10 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2ea20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2ea30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2ea40 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2ea50 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2ea60 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2ea70 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2ea80 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2ea90 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2eaa0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2eab0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2eac0 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2ead0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2eae0 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2eaf0 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2eb00 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2eb10 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2eb20 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2eb30 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2eb40 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2eb50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2eb60 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2eb70 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2eb80 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2eb90 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2eba0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2ebb0 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2ebc0 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2ebd0 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2ebe0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2ebf0 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2ec00 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2ec10 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2ec20 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2ec30 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2ec40 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2ec50 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2ec60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2ec70 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
2ec80 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
2ec90 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2eca0 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
2ecb0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
2ecc0 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
2ecd0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
2ece0 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
2ecf0 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
2ed00 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
2ed10 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
2ed20 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
2ed30 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
2ed40 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
2ed50 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ed60 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ed70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ed80 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ed90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2eda0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
2edb0 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
2edc0 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
2edd0 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
2ede0 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
2edf0 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
2ee00 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
2ee10 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2ee20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
2ee30 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
2ee40 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
2ee50 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2ee60 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ee70 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
2ee80 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
2ee90 45 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65  EVER(pCur->pPage
2eea0 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74  ->leaf==0) ) ret
2eeb0 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70  urn -1;..  n = p
2eec0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2eed0 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
2eee0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
2eef0 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
2ef00 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
2ef10 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
2ef20 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
2ef30 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2ef40 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2ef50 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2ef60 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
2ef70 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
2ef80 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
2ef90 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
2efa0 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
2efb0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2efc0 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
2efd0 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
2efe0 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2eff0 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2f000 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2f010 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2f020 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2f030 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2f040 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2f050 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2f060 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2f070 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2f080 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2f090 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2f0a0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2f0b0 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2f0c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2f0d0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2f0e0 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2f0f0 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2f100 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2f110 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2f120 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2f130 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2f140 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2f150 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
2f160 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2f170 20 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73   F argument in s
2f180 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2f190 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20  C,F) is 1, then 
2f1a0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f  the.** cursor co
2f1b0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2f1c0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
2f1d0 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2f1e0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b   have been.** sk
2f1f0 69 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c  ipped if the SQL
2f200 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20   index had been 
2f210 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2f220 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a   The F argument.
2f230 2a 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ** is a hint to 
2f240 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20  the implement.  
2f250 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2f260 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2f270 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73   not use.** this
2f280 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
2f290 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
2f2a0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2f2b0 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2f2c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2f2d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2f2e0 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
2f2f0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2f300 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2f310 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2f320 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2f330 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2f340 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f350 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  OR_VALID );.  if
2f360 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f370 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2f380 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2f390 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2f3a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2f3b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2f3c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2f3d0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2f3e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f3f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f400 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2f410 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2f420 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2f430 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2f440 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
2f450 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2f460 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2f470 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f480 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2f490 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2f4a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2f4b0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2f4c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2f4d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2f4e0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2f4f0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
2f500 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2f520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2f540 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2f550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2f560 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f570 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  ge;.  idx = ++pC
2f580 75 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21 70  ur->ix;.  if( !p
2f590 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
2f5a0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
2f5b0 6b 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20 74 68  known way for th
2f5c0 69 73 20 74 6f 20 68 61 70 70 65 6e 20 69 73 20  is to happen is 
2f5d0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
2f5e0 61 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  a.    ** recursi
2f5f0 76 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ve SQL function 
2f600 74 68 61 74 20 64 6f 65 73 20 61 20 44 45 4c 45  that does a DELE
2f610 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20  TE operation as 
2f620 70 61 72 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a  part of a.    **
2f630 20 53 45 4c 45 43 54 20 77 68 69 63 68 20 64 65   SELECT which de
2f640 6c 65 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75  letes content ou
2f650 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20  t from under an 
2f660 61 63 74 69 76 65 20 63 75 72 73 6f 72 0a 20 20  active cursor.  
2f670 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
2f680 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
2f690 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 20  where the table 
2f6a0 62 65 69 6e 67 20 44 45 4c 45 54 45 2d 65 64 20  being DELETE-ed 
2f6b0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20  from.    ** has 
2f6c0 70 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20  pages in common 
2f6d0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
2f6e0 65 69 6e 67 20 71 75 65 72 69 65 64 2e 20 20 53  eing queried.  S
2f6f0 65 65 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f  ee TH3.    ** mo
2f700 64 75 6c 65 20 63 6f 76 31 2f 62 74 72 65 65 37  dule cov1/btree7
2f710 38 2e 74 65 73 74 20 74 65 73 74 63 61 73 65 20  8.test testcase 
2f720 32 32 30 20 28 32 30 31 38 2d 30 36 2d 30 38 29  220 (2018-06-08)
2f730 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65   for an.    ** e
2f740 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  xample. */.    r
2f750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2f760 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2f770 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2f780 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2f790 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2f7a0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2f7b0 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2f7c0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2f7d0 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2f7e0 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2f7f0 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2f800 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2f810 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2f820 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2f830 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2f840 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2f850 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2f860 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2f870 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2f880 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2f890 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2f8a0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2f8b0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2f8c0 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2f8d0 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2f8e0 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2f8f0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2f900 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2f910 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f920 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2f930 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2f940 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2f950 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2f960 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2f970 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f980 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2f990 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2f9a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2f9b0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2f9c0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2f9d0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2f9e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2f9f0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2fa00 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2fa10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2fa20 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2fa30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
2fa40 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
2fa50 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69   }while( pCur->i
2fa60 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2fa70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2fa80 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2fa90 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2faa0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2fab0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
2fac0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fad0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2fae0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2faf0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2fb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2fb10 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2fb20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2fb30 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2fb40 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2fb50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2fb60 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d   int flags){.  M
2fb70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2fb80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2fb90 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20  R( flags );  /* 
2fba0 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62  Used in COMDB2 b
2fbb0 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51  ut not native SQ
2fbc0 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  Lite */.  assert
2fbd0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2fbe0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2fbf0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2fc00 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
2fc10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fc20 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2fc30 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2fc40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
2fc50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2fc60 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2fc70 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2fc80 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2fc90 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
2fca0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2fcb0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2fcc0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2fcd0 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Cur);.  pPage = 
2fce0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2fcf0 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e  f( (++pCur->ix)>
2fd00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2fd10 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b  .    pCur->ix--;
2fd20 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2fd30 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d  eNext(pCur);.  }
2fd40 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2fd50 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2fd60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2fd70 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2fd80 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2fd90 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2fda0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2fdb0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2fdc0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2fdd0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2fde0 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  base..** Return 
2fdf0 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  values:.**.**   
2fe00 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
2fe10 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53  success.**     S
2fe20 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65  QLITE_DONE   the
2fe30 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2fe40 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  dy on the first 
2fe50 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
2fe60 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65  able.**     othe
2fe70 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b  rwise     some k
2fe80 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63  ind of error occ
2fe90 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  urred.**.** The 
2fea0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2feb0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2fec0 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2fed0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2fee0 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2fef0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2ff00 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2ff10 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2ff20 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2ff30 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2ff40 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2ff50 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2ff60 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2ff70 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2ff80 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2ff90 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2ffa0 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2ffb0 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2ffc0 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2ffd0 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2ffe0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2fff0 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74  If bit 0x01 of t
30000 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f  he F argument to
30010 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
30020 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c  vious(C,F) is 1,
30030 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72   then.** the cur
30040 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  sor corresponds 
30050 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
30060 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
30070 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
30080 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74  .** skipped if t
30090 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  he SQL index had
300a0 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69   been a unique i
300b0 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67  ndex.  The F arg
300c0 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69  ument is a.** hi
300d0 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d  nt to the implem
300e0 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65  ent.  The native
300f0 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
30100 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
30110 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69  s not.** use thi
30120 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44  s hint, but COMD
30130 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74  B2 does..*/.stat
30140 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
30150 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
30160 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
30170 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
30180 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30190 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
301a0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
301b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
301c0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
301d0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
301e0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
301f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
30200 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
30210 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42  & (BTCF_AtLast|B
30220 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
30230 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d  CF_ValidNKey))==
30240 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30250 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
30260 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
30270 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30280 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
30290 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
302a0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
302b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
302c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
302d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
302e0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
302f0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
30300 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
30310 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
30320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30330 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
30340 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30350 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
30360 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
30370 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30380 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
30390 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
303a0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
303b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
303c0 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
303d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
303e0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
303f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30400 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
30410 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
30420 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
30430 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
30440 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
30450 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
30460 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
30470 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
30480 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69  nt idx = pCur->i
30490 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  x;.    rc = move
304a0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
304b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
304c0 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
304d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
304e0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
304f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
30500 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
30510 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
30520 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >ix==0 ){.      
30530 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
30540 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
30550 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
30560 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
30570 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30580 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
30590 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
305a0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
305b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
305c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
305d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
305e0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
305f0 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  & (BTCF_ValidOvf
30600 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
30610 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70  Cur->ix--;.    p
30620 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
30630 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ge;.    if( pPag
30640 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
30650 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30670 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
30680 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 0);.    }else
30690 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
306a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
306b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
306c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
306d0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
306e0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c  or *pCur, int fl
306f0 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
30700 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
30710 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
30720 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
30730 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20  | flags==1 );.  
30740 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
30750 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
30760 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
30770 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55  R_VALID );.  UNU
30780 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66  SED_PARAMETER( f
30790 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64  lags );  /* Used
307a0 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e   in COMDB2 but n
307b0 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65  ot native SQLite
307c0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   */.  pCur->curF
307d0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
307e0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
307f0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
30800 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  Key);.  pCur->in
30810 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
30820 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
30830 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20  !=CURSOR_VALID. 
30840 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30    || pCur->ix==0
30850 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  .   || pCur->pPa
30860 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  ge->leaf==0.  ){
30870 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
30880 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b  ePrevious(pCur);
30890 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d  .  }.  pCur->ix-
308a0 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
308b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
308c0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
308d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
308e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
308f0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
30900 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
30910 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
30920 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
30930 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
30940 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
30950 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
30960 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
30970 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
30980 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
30990 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
309a0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
309b0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
309c0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
309d0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
309e0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
309f0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
30a00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
30a10 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
30a20 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
30a30 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
30a40 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
30a50 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
30a60 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
30a70 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
30a80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
30a90 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
30aa0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
30ab0 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
30ac0 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
30ad0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
30ae0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
30af0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
30b00 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
30b10 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
30b20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
30b30 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
30b40 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
30b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
30b60 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
30b70 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
30b80 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
30b90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
30ba0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
30bb0 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
30bc0 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
30bd0 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
30be0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
30bf0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
30c00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
30c10 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
30c20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
30c30 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
30c40 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
30c50 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
30c60 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
30c70 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
30c80 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
30c90 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
30ca0 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
30cb0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
30cc0 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
30cd0 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
30ce0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
30cf0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
30d00 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
30d10 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
30d20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
30d30 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
30d40 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
30d50 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
30d60 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
30d70 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
30d80 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
30d90 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
30da0 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
30db0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
30dc0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
30dd0 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
30de0 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
30df0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
30e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
30e10 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
30e20 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
30e30 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
30e40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
30e50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
30e60 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
30e70 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
30e80 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
30e90 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
30ea0 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
30eb0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
30ec0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
30ed0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
30ee0 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
30ef0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
30f00 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
30f10 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
30f20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
30f30 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
30f40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
30f50 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
30f60 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
30f70 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
30f80 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
30f90 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
30fa0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
30fb0 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
30fc0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
30fd0 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
30fe0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
30ff0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
31000 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
31010 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
31020 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
31030 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
31040 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
31050 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
31060 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
31070 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
31080 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
31090 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
310a0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
310b0 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
310c0 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
310d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
310e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
310f0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
31100 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
31110 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
31120 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
31130 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
31140 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
31150 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
31160 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
31170 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
31180 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
31190 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
311a0 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
311b0 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
311c0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
311d0 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
311e0 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
311f0 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
31200 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
31210 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
31220 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
31230 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
31240 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
31250 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
31260 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
31270 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
31280 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
31290 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
312a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
312b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
312c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
312d0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
312e0 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
312f0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
31300 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
31310 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
31320 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
31330 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
31340 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
31350 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
31360 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
31370 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
31380 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
31390 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
313a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
313b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
313c0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
313d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
313e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
313f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
31400 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
31410 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
31420 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
31430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
31440 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
31450 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
31460 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
31470 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
31480 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
31490 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
314a0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
314b0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
314c0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
314d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
314e0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
314f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31500 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31510 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
31520 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
31530 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
31540 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
31550 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
31560 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
31570 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
31580 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
31590 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
315a0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
315b0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
315c0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
315d0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
315e0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
315f0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
31600 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
31610 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
31620 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
31630 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
31640 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
31650 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
31660 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
31670 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
31680 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
31690 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
316a0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
316b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
316c0 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
316d0 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
316e0 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
316f0 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
31700 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
31710 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
31720 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
31730 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
31740 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
31750 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
31760 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
31770 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
31780 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
31790 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
317a0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
317b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
317c0 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
317d0 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
317e0 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
317f0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
31800 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
31810 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
31820 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
31830 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
31840 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
31850 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
31860 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31870 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
31880 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
31890 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
318a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
318b0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
318c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
318d0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
318e0 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
318f0 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
31900 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
31910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31920 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65  ORRUPT_PGNO(pPre
31930 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72  vTrunk ? pPrevTr
31940 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a  unk->pgno : 1);.
31950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31960 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
31970 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
31980 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
31990 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
319a0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
319b0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
319c0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
319d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
319e0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
319f0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
31a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
31a10 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
31a20 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
31a30 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31a40 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
31a50 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
31a60 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
31a70 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
31a80 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
31a90 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
31aa0 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
31ab0 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
31ac0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31ad0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
31ae0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
31af0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
31b00 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
31b10 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
31b20 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
31b30 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
31b40 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
31b50 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
31b60 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
31b70 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
31b80 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
31b90 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
31ba0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
31bb0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
31bc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
31bd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31be0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
31bf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
31c00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
31c10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31c20 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
31c40 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
31c50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
31c60 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
31c70 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
31c80 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
31c90 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
31ca0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
31cb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
31cc0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
31cd0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
31ce0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
31cf0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
31d00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
31d10 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
31d20 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
31d30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
31d40 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
31d50 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
31d60 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
31d70 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
31d80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
31d90 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
31da0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
31db0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
31dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31dd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31de0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
31df0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
31e00 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
31e10 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
31e20 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
31e30 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
31e40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31e50 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
31e60 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
31e70 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
31e80 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
31e90 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
31ea0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
31eb0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
31ec0 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
31ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
31ee0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
31ef0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
31f00 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
31f10 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
31f20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
31f30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31f40 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
31f50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31f60 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
31f70 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31f80 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
31f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
31fa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
31fb0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
31fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
31fd0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
31fe0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
31ff0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
32000 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32010 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32030 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
32040 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32050 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32070 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32080 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
320a0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
320b0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
320c0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
320d0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
320e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
320f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32100 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
32110 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
32120 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
32130 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
32140 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
32150 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
32160 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
32170 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
32180 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
32190 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
321a0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
321b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
321c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
321d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
321e0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
321f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
32200 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
32210 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
32220 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
32230 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
32240 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32250 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
32260 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32270 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32280 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
32290 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
322a0 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
322b0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
322c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
322d0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
322e0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
322f0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
32300 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32320 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32330 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32360 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
32370 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
323a0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
323b0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
323c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
323d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
323e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
323f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
32400 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
32410 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
32420 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 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 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
32450 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
32460 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32470 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32480 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
32490 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
324a0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
324b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
324c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
324d0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
324e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
324f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32500 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32510 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
32520 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
32530 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
32540 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
32550 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32580 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
32590 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
325a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
325b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
325c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
325d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
325e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
325f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
32600 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
32610 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
32620 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
32630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32640 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
32650 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
32660 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
32670 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
32680 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
32690 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
326a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
326b0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
326c0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
326d0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
326e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
326f0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
32700 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
32710 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
32720 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
32730 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
32740 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
32750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
32760 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
32770 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
32780 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
32790 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
327a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
327b0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
327c0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
327d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
327e0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
327f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
32800 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
32810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32820 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
32830 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
32840 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
32850 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
32860 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
32870 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
32880 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
32890 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
328a0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
328b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
328c0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
328d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
328e0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
328f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
32900 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
32910 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
32920 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
32930 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
32940 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
32950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32960 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
32980 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
32990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
329a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
329b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
329c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
329d0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
329e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
329f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
32a00 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
32a10 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
32a20 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
32a30 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
32a40 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
32a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
32a60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32a70 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
32a80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32a90 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32aa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
32ac0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
32ad0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
32ae0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
32af0 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
32b00 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
32b10 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
32b20 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
32b30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
32b40 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
32b50 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
32b60 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
32b70 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
32b80 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
32b90 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
32ba0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
32bb0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
32bc0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
32bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32be0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
32bf0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
32c00 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
32c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32c20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32c30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
32c50 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
32c60 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32c70 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
32c80 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
32c90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
32ca0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
32cb0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
32cc0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
32cd0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
32ce0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
32cf0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
32d00 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
32d10 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
32d20 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
32d30 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
32d40 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
32d50 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32d60 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
32d70 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
32d80 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
32d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32db0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32dc0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
32dd0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
32de0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
32df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
32e10 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
32e20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
32e30 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
32e40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32e60 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
32e70 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
32e80 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
32e90 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
32ea0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
32eb0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
32ec0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
32ed0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
32ee0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
32ef0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
32f00 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
32f10 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
32f20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
32f30 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
32f40 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
32f50 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
32f60 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
32f70 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
32f80 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
32f90 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
32fa0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
32fb0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
32fc0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
32fd0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
32fe0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
32ff0 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
33000 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
33010 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
33020 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
33030 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
33040 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
33050 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
33060 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
33070 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
33080 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
33090 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
330a0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
330b0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
330c0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
330d0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
330e0 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
330f0 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
33100 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
33110 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
33120 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
33130 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
33140 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
33150 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
33160 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
33170 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
33180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
33190 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
331a0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
331b0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
331c0 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
331d0 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
331e0 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
331f0 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
33200 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
33210 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
33220 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
33230 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
33240 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
33250 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
33260 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
33270 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
33280 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
33290 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
332a0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
332b0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
332c0 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
332d0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
332e0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
332f0 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
33300 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
33310 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
33320 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
33330 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
33340 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
33350 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
33360 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
33370 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
33380 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33390 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
333a0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
333b0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
333c0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
333d0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
333e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
333f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
33400 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
33410 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
33420 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
33430 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
33440 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
33450 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
33460 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
33470 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
33480 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
33490 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
334a0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
334b0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
334c0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
334d0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
334e0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
334f0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
33500 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
33510 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33520 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
33530 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
33540 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
33550 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
33560 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
33570 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
33580 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
33590 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
335a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
335b0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
335c0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
335d0 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
335e0 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
335f0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
33600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33610 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
33620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33630 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
33640 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
33650 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
33660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
33670 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
33680 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
33690 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
336a0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
336b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
336c0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
336d0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
336e0 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
336f0 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
33700 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
33710 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
33720 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
33730 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
33740 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
33750 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
33760 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33770 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33780 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
33790 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
337a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
337b0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
337c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
337d0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
337e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
337f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33800 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33810 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
33820 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
33830 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
33840 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
33850 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
33860 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
33870 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
33880 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33890 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
338a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
338b0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
338c0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
338d0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
338e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
338f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
33900 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
33910 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
33920 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
33930 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33940 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
33950 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
33960 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
33970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
33980 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
33990 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
339a0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
339b0 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
339c0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
339d0 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
339e0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
339f0 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
33a00 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
33a10 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
33a20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33a30 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
33a40 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
33a50 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
33a60 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
33a70 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
33a80 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
33a90 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
33aa0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
33ab0 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
33ac0 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
33ad0 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
33ae0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
33af0 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
33b00 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
33b10 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
33b20 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
33b30 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
33b40 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
33b50 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
33b60 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
33b70 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
33b80 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
33b90 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
33ba0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
33bb0 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
33bc0 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
33bd0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
33be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33bf0 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
33c00 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
33c10 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
33c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c30 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
33c40 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
33c50 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
33c60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
33c70 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
33c80 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
33c90 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
33ca0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
33cb0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
33cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
33cd0 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
33ce0 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
33cf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
33d20 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
33d30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
33d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33d50 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
33d60 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
33d70 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
33d80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33d90 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
33da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
33db0 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
33dc0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
33dd0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
33de0 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
33df0 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
33e00 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
33e10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33e20 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
33e30 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
33e40 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
33e50 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
33e60 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
33e70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
33e80 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
33e90 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
33ea0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
33eb0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
33ec0 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
33ed0 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
33ee0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33ef0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
33f00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
33f10 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33f20 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
33f30 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
33f40 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
33f50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
33f60 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
33f70 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
33f80 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
33f90 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
33fa0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
33fb0 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
33fc0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
33fd0 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
33fe0 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
33ff0 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
34000 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
34010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
34020 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
34030 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
34040 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
34050 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
34060 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
34070 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
34080 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
34090 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
340a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
340b0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
340c0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
340d0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
340e0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
340f0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
34100 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
34110 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
34120 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
34130 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
34140 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
34150 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
34160 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
34170 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
34180 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
34190 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
341a0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
341b0 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
341c0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
341d0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
341e0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
341f0 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
34200 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
34210 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
34220 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
34230 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
34240 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
34250 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
34260 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
34270 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
34280 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
34290 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
342a0 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
342b0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
342c0 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
342d0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
342e0 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
342f0 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
34300 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
34310 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
34320 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
34330 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
34340 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
34350 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
34360 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
34370 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
34380 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
34390 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
343a0 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
343b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
343c0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
343d0 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
343e0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
343f0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
34400 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
34410 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
34420 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
34430 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
34440 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
34450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
34470 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
34480 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
34490 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
344a0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
344b0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
344c0 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
344d0 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
344e0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
344f0 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
34500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34510 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
34520 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34530 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
34540 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
34550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
34560 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
34570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34580 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
34590 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
345a0 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
345b0 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
345c0 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
345d0 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
345e0 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
345f0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
34600 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
34610 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
34620 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
34630 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
34640 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
34650 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
34660 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
34670 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
34680 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
34690 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
346a0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
346b0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
346c0 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
346d0 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
346e0 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
346f0 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
34700 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
34710 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
34720 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
34730 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
34740 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
34750 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
34760 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
34770 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
34780 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34790 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
347a0 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
347b0 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
347c0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
347d0 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
347e0 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
347f0 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
34800 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
34810 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
34820 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
34830 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
34840 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
34850 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
34860 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
34870 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
34880 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
34890 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
348a0 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
348b0 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
348c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
348d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32  DENCE-OF: R-1992
348e0 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c  0-11576 However,
348f0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
34900 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a  of SQLite still.
34910 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75        ** avoid u
34920 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69  sing the last si
34930 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  x entries in the
34940 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34950 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20  page array in.  
34960 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61      ** order tha
34970 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
34980 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65   created by newe
34990 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
349a0 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  Lite can be.    
349b0 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64    ** read by old
349c0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
349d0 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  QLite..      */.
349e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
349f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
34a00 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
34a10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34a30 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
34a40 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
34a50 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
34a60 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
34a70 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
34a80 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
34a90 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
34aa0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
34ab0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
34ac0 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
34ad0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34ae0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
34af0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
34b10 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
34b20 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
34b30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34b40 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
34b50 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
34b60 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
34b70 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
34b80 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
34b90 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
34ba0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
34bb0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
34bc0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
34bd0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
34be0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
34bf0 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
34c00 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
34c10 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
34c20 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
34c30 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
34c40 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
34c50 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
34c60 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
34c70 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
34c80 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
34c90 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
34ca0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
34cb0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
34cc0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
34cd0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
34ce0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
34cf0 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
34d00 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
34d10 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
34d20 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
34d30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
34d40 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34d50 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
34d60 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
34d70 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
34d80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
34d90 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
34da0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
34db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34dc0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
34dd0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
34de0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
34df0 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
34e00 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34e10 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
34e20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
34e30 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
34e40 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
34e50 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
34e60 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
34e70 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
34e80 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
34e90 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
34ea0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
34eb0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
34ec0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
34ed0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
34ee0 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
34ef0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
34f00 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
34f10 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
34f20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
34f30 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
34f40 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
34f50 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
34f60 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
34f70 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
34f80 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
34f90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
34fa0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
34fb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34fc0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
34fd0 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20    Store.** size 
34fe0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
34ff0 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49  t the cell in pI
35000 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nfo..*/.static i
35010 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
35020 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
35030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35040 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
35050 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
35060 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35070 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
35080 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
35090 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ell */.  CellInf
350a0 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
350b0 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d    /* Size inform
350c0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
350d0 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  cell */.){.  BtS
350e0 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67  hared *pBt;.  Pg
350f0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
35100 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
35110 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61  fl;.  u32 ovflPa
35120 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
35130 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35140 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
35150 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
35160 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
35170 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
35180 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  nfo);.  if( pInf
35190 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f  o->nLocal==pInfo
351a0 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ->nPayload ){.  
351b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
351c0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
351d0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
351e0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
351f0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
35200 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
35210 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  l + pInfo->nSize
35220 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61   == pPage->aData
35230 45 6e 64 20 29 3b 0a 20 20 74 65 73 74 63 61 73  End );.  testcas
35240 65 28 20 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66  e( pCell + (pInf
35250 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70  o->nSize-1) == p
35260 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
35270 3b 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 2b 20  ;.  if( pCell + 
35280 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70  pInfo->nSize > p
35290 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
352a0 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78  {.    /* Cell ex
352b0 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
352c0 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65  f page */.    re
352d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
352e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
352f0 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
35300 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
35310 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   + pInfo->nSize 
35320 2d 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  - 4);.  pBt = pP
35330 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
35340 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
35350 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
35360 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
35370 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
35380 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66  .  nOvfl = (pInf
35390 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49  o->nPayload - pI
353a0 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  nfo->nLocal + ov
353b0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
353c0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
353d0 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20  assert( nOvfl>0 
353e0 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54  || .    (CORRUPT
353f0 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e  _DB && (pInfo->n
35400 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
35410 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
35420 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
35430 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
35440 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
35450 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
35460 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
35470 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
35480 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
35490 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
354a0 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
354b0 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
354c0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
354d0 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
354e0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
354f0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
35500 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
35510 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
35520 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
35530 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
35540 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
35550 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
35560 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35570 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
35580 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
35590 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
355a0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
355b0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
355c0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
355d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
355e0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
355f0 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
35600 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
35610 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
35620 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
35630 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
35640 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
35650 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
35660 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
35670 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
35680 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
35690 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
356a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
356b0 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
356c0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
356d0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
356e0 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
356f0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
35700 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
35710 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
35720 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
35730 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35740 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
35750 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
35760 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
35770 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
35780 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
35790 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
357a0 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
357b0 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
357c0 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
357d0 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
357e0 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
357f0 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
35800 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
35810 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
35820 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
35830 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
35840 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
35850 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
35860 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
35870 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
35880 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
35890 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
358a0 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
358b0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
358c0 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
358d0 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
358e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
358f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
35900 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
35910 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
35920 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
35930 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
35940 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
35950 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35960 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
35970 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
35980 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
35990 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
359a0 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
359b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
359c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
359d0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
359e0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
359f0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
35a00 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
35a10 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
35a20 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
35a30 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
35a40 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
35a50 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
35a60 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
35a70 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
35a80 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
35a90 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
35aa0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
35ab0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
35ac0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
35ad0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
35ae0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
35af0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
35b00 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
35b10 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
35b20 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
35b30 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
35b40 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
35b50 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
35b60 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
35b70 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
35b80 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
35b90 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
35ba0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
35bb0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
35bc0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
35bd0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
35be0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35bf0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35c00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35c10 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
35c20 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
35c30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35c40 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
35c50 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
35c60 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
35c70 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f  const BtreePaylo
35c80 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f  ad *pX,        /
35c90 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77  * Payload with w
35ca0 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63  hich to construc
35cb0 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  t the cell */.  
35cc0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35ce0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
35cf0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
35d00 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
35d10 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
35d20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
35d30 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63  , mn;.  int spac
35d40 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
35d50 20 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20   *pToRelease;.  
35d60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
35d70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
35d80 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
35d90 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
35da0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
35db0 66 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65  fl;.  int nHeade
35dc0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
35dd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35de0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35df0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
35e00 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
35e10 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
35e20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
35e30 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
35e40 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
35e50 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
35e60 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
35e70 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
35e80 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
35e90 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
35ea0 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
35eb0 44 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d  Data[pPage->pBt-
35ec0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
35ed0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
35ee0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35ef0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35f00 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
35f10 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
35f20 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
35f30 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
35f40 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  e;.  if( pPage->
35f50 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50  intKey ){.    nP
35f60 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61  ayload = pX->nDa
35f70 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a  ta + pX->nZero;.
35f80 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
35f90 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
35fa0 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20   pX->nData;.    
35fb0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
35fc0 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20  ntKeyLeaf ); /* 
35fd0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
35fe0 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61  y called for lea
35ff0 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64  ves */.    nHead
36000 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
36010 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
36020 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
36030 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
36040 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
36050 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
36060 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  pX->nKey);.  }el
36070 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
36080 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66  pX->nKey<=0x7fff
36090 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79  ffff && pX->pKey
360a0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20  !=0 );.    nSrc 
360b0 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e  = nPayload = (in
360c0 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20  t)pX->nKey;.    
360d0 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b  pSrc = pX->pKey;
360e0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
360f0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
36100 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
36110 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20  yload);.  }.  . 
36120 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
36130 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61  payload */.  pPa
36140 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
36150 48 65 61 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e  Header];.  if( n
36160 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
36170 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
36180 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
36190 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
361a0 20 65 76 65 72 79 74 68 69 6e 67 20 66 69 74 73   everything fits
361b0 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 70 61   on the btree pa
361c0 67 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f  ge.    ** and no
361d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
361e0 61 72 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  are required. */
361f0 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
36200 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
36210 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
36220 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
36230 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
36240 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
36250 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
36260 20 20 20 61 73 73 65 72 74 28 20 6e 53 72 63 3c     assert( nSrc<
36270 3d 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  =nPayload );.   
36280 20 74 65 73 74 63 61 73 65 28 20 6e 53 72 63 3c   testcase( nSrc<
36290 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
362a0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
362b0 20 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20   pSrc, nSrc);.  
362c0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
362d0 64 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c  d+nSrc, 0, nPayl
362e0 6f 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72  oad-nSrc);.    r
362f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
36310 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
36320 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
36330 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e   some of the con
36340 74 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20  tent will need. 
36350 20 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74   ** to spill ont
36360 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
36370 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50  ..  */.  mn = pP
36380 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
36390 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
363a0 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
363b0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
363c0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65 73 74  ize - 4);.  test
363d0 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
363e0 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
363f0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
36400 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
36410 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
36420 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
36430 6d 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  mn;.  spaceLeft 
36440 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  = n;.  *pnSize =
36450 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
36460 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
36470 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a  ell[nHeader+n];.
36480 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30    pToRelease = 0
36490 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  ;.  pgnoOvfl = 0
364a0 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
364b0 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  >pBt;..  /* At t
364c0 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
364d0 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
364e0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
364f0 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
36500 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
36510 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
36520 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
36530 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
36540 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
36550 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
36560 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
36570 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
36580 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
36590 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
365a0 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
365b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
365c0 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
365d0 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
365e0 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
365f0 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
36600 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
36610 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
36620 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
36630 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
36640 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
36650 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
36660 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
36670 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
36680 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
36690 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
366a0 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
366b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
366c0 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
366d0 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
366e0 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
366f0 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
36700 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
36710 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
36720 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36730 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
36740 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
36750 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
36760 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
36770 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
36780 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
36790 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
367a0 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79  o.nKey==pX->nKey
367b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
367c0 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
367d0 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
367e0 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
367f0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
36800 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
36810 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
36820 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
36830 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
36840 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
36850 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
36860 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 6e  hile( 1 ){.    n
36870 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
36880 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
36890 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
368a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
368b0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
368c0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
368d0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
368e0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
368f0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
36900 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
36910 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
36920 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
36930 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
36940 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
36950 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36960 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
36970 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
36980 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
36990 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
369a0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
369b0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
369c0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
369d0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
369e0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
369f0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
36a00 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
36a10 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
36a20 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
36a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36a40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36a50 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
36a60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
36a70 69 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20  if( nSrc>=n ){. 
36a80 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
36a90 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
36aa0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53      }else if( nS
36ab0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  rc>0 ){.      n 
36ac0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d 65  = nSrc;.      me
36ad0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
36ae0 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
36af0 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
36b00 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
36b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
36b20 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  load -= n;.    i
36b30 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29  f( nPayload<=0 )
36b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 79   break;.    pPay
36b50 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
36b60 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
36b70 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
36b80 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
36b90 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
36ba0 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  0 ){.      MemPa
36bb0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23  ge *pOvfl = 0;.#
36bc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36bd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36be0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
36bf0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
36c00 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
36c10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36c20 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
36c30 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
36c40 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
36c50 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
36c60 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
36c70 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
36c80 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
36c90 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
36ca0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
36cb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
36cc0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
36cd0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
36ce0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
36cf0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
36d00 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
36d10 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
36d20 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
36d30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36d40 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
36d50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
36d60 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
36d70 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
36d80 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
36d90 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
36da0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
36db0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
36dc0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
36dd0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
36de0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
36df0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
36e00 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
36e10 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
36e20 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
36e30 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
36e40 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
36e50 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
36e60 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
36e70 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
36e80 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
36e90 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
36ea0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
36eb0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
36ec0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
36ed0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
36ee0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
36ef0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
36f00 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
36f10 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
36f20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
36f30 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
36f40 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
36f50 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
36f60 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
36f70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36f80 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
36f90 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
36fa0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
36fb0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
36fc0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
36fd0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
36fe0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
36ff0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
37000 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
37010 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37020 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
37030 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
37040 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
37050 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
37060 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
37070 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37080 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
37090 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
370a0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
370b0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
370c0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
370d0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
370e0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
370f0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
37100 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
37110 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
37120 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
37130 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
37140 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37150 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
37160 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
37170 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
37180 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
37190 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
371a0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
371b0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
371c0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
371d0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
371e0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
371f0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
37200 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
37210 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
37220 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37230 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
37240 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
37250 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
37260 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
37270 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
37280 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37290 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
372a0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
372b0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
372c0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
372d0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
372e0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
372f0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
37300 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
37310 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
37320 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
37330 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
37340 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
37350 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
37370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
37380 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
37390 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
373a0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
373b0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
373c0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
373d0 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
373e0 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
373f0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
37400 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
37410 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
37420 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
37430 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
37440 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
37450 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
37460 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
37470 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
37480 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
37490 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
374a0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
374b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
374c0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
374d0 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
374e0 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
374f0 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
37500 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
37510 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
37520 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
37530 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
37540 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
37550 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
37560 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
37570 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
37580 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
37590 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
375a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
375b0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
375c0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
375d0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
375e0 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
375f0 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
37600 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
37610 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
37620 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
37630 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
37640 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
37650 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
37660 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
37670 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
37680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
37690 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
376a0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
376b0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
376c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
376d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
376e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
376f0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
37700 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
37710 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
37720 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
37730 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
37740 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
37750 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
37760 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
37770 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
37780 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
37790 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
377a0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
377b0 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
377c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
377d0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
377e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
377f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37800 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
37810 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
37820 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
37830 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
37840 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37850 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
37860 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
37870 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
37880 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
37890 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
378a0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
378b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
378c0 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
378d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
378e0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
378f0 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
37900 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
37910 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
37920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37930 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
37940 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
37950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
37960 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
37970 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
37980 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
37990 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
379a0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
379b0 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
379c0 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
379d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
379e0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
379f0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
37a00 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
37a10 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
37a20 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
37a30 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
37a40 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
37a50 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
37a60 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
37a70 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
37a80 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
37a90 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
37aa0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
37ab0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
37ac0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
37ad0 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
37ae0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
37af0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
37b00 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
37b10 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
37b20 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
37b30 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
37b40 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
37b50 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
37b60 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
37b70 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
37b80 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
37b90 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
37ba0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
37bb0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
37bc0 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
37bd0 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
37be0 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d  ed..**.** *pRC m
37bf0 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  ust be SQLITE_OK
37c00 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
37c10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
37c20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
37c30 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
37c40 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
37c50 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
37c60 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
37c70 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
37c80 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
37c90 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
37ca0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
37cb0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
37cc0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
37cd0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
37ce0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
37cf0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
37d00 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
37d10 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
37d20 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
37d30 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
37d40 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
37d50 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
37d60 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
37d70 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
37d80 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
37d90 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
37da0 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
37db0 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
37dc0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
37dd0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
37de0 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
37df0 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
37e00 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
37e10 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
37e20 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
37e30 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
37e40 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
37e50 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
37e60 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
37e70 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
37e80 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
37e90 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
37ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
37eb0 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
37ec0 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
37ed0 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
37ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43  ..  assert( *pRC
37ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
37f00 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
37f10 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
37f20 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
37f30 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
37f40 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
37f50 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
37f60 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
37f70 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
37f80 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
37f90 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
37fa0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
37fb0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
37fc0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
37fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
37fe0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
37ff0 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
38000 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
38010 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
38020 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
38030 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
38040 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
38050 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
38060 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
38070 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
38080 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
38090 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
380a0 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
380b0 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
380c0 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
380d0 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
380e0 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
380f0 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
38100 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
38110 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
38120 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
38130 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
38140 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
38150 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
38160 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
38170 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
38180 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
38190 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
381a0 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
381b0 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
381c0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
381d0 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
381e0 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
381f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
38200 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
38210 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
38220 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
38230 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
38240 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
38250 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
38260 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
38270 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
38280 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
38290 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
382a0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
382b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
382c0 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ;.    /* Compari
382d0 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61  son against Arra
382e0 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65  ySize-1 since we
382f0 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65   hold back one e
38300 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a  xtra slot.    **
38310 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63   as a contingenc
38320 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
38330 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d  ds, never need m
38340 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66  ore than 3 overf
38350 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73  low.    ** slots
38360 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63   but 4 are alloc
38370 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65  ated, just to be
38380 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73   safe. */.    as
38390 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53  sert( j < ArrayS
383a0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
383b0 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l)-1 );.    pPag
383c0 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
383d0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
383e0 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
383f0 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
38400 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
38410 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
38420 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
38430 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
38440 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
38450 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
38460 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
38470 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
38480 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
38490 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only